2017-06-28 9 views
0

CoreDataに異常な問題があります。私が最初にデータをロードすると、すべて正常に動作しているように見えますが、データを保存した後は、その後のフェッチ要求がすべて停止します(または空の状態に戻ります)。コアデータを保存するとフェッチ要求が中断されます

私は、udacityによってプロジェクトの例であるthisプロジェクトからCoreDataStackをコピーしました。保存補助機能が含まれています。

func save() { 
     context.performAndWait() { 
      if self.context.hasChanges { 
       do { 
        try self.context.save() 
       } catch { 
        fatalError("Error while saving main context: \(error)") 
       } 
       // now we save in the background 
       self.persistingContext.perform() { 
        do { 
         try self.persistingContext.save() 
        } catch { 
         fatalError("Error while saving persisting context: \(error)") 
        } 
       } 
      } 
     } 
    } 

私のビューコントローラでは、以下のようなコードを使用して異なる述語に対して通常のフェッチ要求を実行できます。

fetchedResultsController?.fetchRequest.predicate = NSPredicate(format: "fromDatetime >= %@ AND fromDatetime < %@", argumentArray: [selectionTime, selectionTime + 3600_000]) 
fetchedResultsController?.managedObjectContext.refreshAllObjects() 
let m = fetchedResultsController?.fetchedObjects as! [Measurement] 
print("number of elements in m: \(m.count)") 

テストボタンを使用してデータを保存した後。

@IBAction func testAction(_ sender: Any) { 
    // test action 
    print("test clicked") 
    let delegate = UIApplication.shared.delegate as! AppDelegate 
    let stack = delegate.stack 
    stack.save() 
} 

以降のフェッチ要求はすべて空です。また、デバイスに保存されているすべてのデータを含むUITableViewControllerを実装する別のViewControllerを作成しました。私がそれを開くと、保存した後もデータはそこに正しく表示されます。 このような動作を引き起こす原因は何ですか?

答えて

0

これは、performAndWait()がUIスレッドをブロックするデッドロックの原因である可能性があります。これは、異なるキューで動作し、すべてが同じ公開キューを共有しているわけではないためです。これを解決するには、managedObjectContextのインスタンス変数を設定し、このコンテキストを常に参照してmanagedObjectContextへのアクセスをブロックしないようにします。

lazy var mainContext: NSManagedObjectContext = { 
let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate 
return appDelegate!.managedObjectContext 
} 

これも同様の問題を解決するquestionを参照してください。

関連する問題