web-dev-qa-db-ja.com

NSManagedObjectの新しいfetchRequest関数を使用してフェッチ要求を行うにはどうすればよいですか?

IOS 10では、CoreDataチームがNSManagedObjectに新しい「fetchRequest」メソッドを追加しました。次のようになります。

public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>

私が理解していることから、これはこれを置き換えることができます:

let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")

これとともに:

let request = MyEntity.fetchRequest()

ただし、次のような簡単なリクエストをしようとすると:

let request = MyEntity.fetchRequest()
do {
    results = try request.execute()
} catch let error {
    print("failed to fetch coffee object: \(error)")
}

次のエラーが表示されます。

Error Domain = NSCocoaErrorDomain Code = 134060 "(null)" UserInfo = {message = NSManagedObjectContextがスコープ内にないとフェッチできません}

そのため、明らかにNSManagedObjectContextをスコープに入れる必要があるというエラーが表示されています。私は例を探してきましたが、新しいAPI機能を使用してリクエストを実行する方法の完全な例を見つけることができるようです。

質問

最新のCore Data API機能を使用して、簡単なフェッチリクエストを行うにはどうすればよいですか?根本的な問題は、NSmanagedObjectCotnextをどのようにスコープに入れるかです。

従来の構文を使用してリクエストを正常に作成できることに注意してください。

22
Dan Beaulieu

わかりました、私はこれをする2つの方法を見つけました。 最初のアプローチ、これは私の例のコードに似ていますが、単純です:

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

 do {
     results = try moc.fetch(request)
 } catch { // error stuff}

WWDC 2016で示された2番目のアプローチは、フェッチ要求オブジェクトで「execute」という名前の関数を使用します。

NSFetchRequestの詳細を表示すると、ブロック内で操作を実行する必要があることを明確に示すコメントが表示されます。

   // Executes the fetch request using the current managed object context. This method must be called from within a block submitted to a managed object context.
    @available(iOS 10.0, *)
    public func execute() throws -> [ResultType]

これがフェッチを実行する方法であることが私にはわかりました:

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

moc.perform {
    self.results = try! request.execute()
}

自分で転がす人向け

独自のコードを展開している場合、コードがコンパイルされないことがあります。自動生成されたコードには、fetchRequestという新しいメソッドが含まれています。このメソッドは、コンパイラーが型を渡すために使用します。コードは次のようになります。

@nonobjc public class func fetchRequest() -> NSFetchRequest<MyEntity> {
    return NSFetchRequest<MyEntity>(entityName: "MyEntity");
}
31
Dan Beaulieu

For i OS 1Swift)以下の方法が助けてくれました:

var userRecordsArray: [UserProfile] = []

func getData() {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserProfile")
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        userRecordsArray = try managedContext.fetch(fetchRequest) as! [UserProfile]
    } catch {
        print("Fetching Failed")
    }
}
8
user4886069