29

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

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)")
}

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

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

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

質問

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

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

4

2 に答える 2

37

わかりました、これを行う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");
}
于 2016-07-15T03:36:47.550 に答える
9

iOS 10Swift 3)の場合、次の方法が役に立ちました:

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")
    }
}
于 2017-01-24T07:45:57.920 に答える