0

次のコードは、my tableViewControllerのデータ(フェーズデータ)をフェッチしています。私はNSManagedDocumentのmanagedObjectContextを使って自分のデータベースを埋める(あらかじめ設定)。ソースは、Xcodeのリソースフォルダに直接載っているTXTファイルからクリーンアップする配列です。この作成後、私はクローズ/オープンとノーマルのような書類を持っています。コアデータコードとマルチスレッド

次のコードは、フェッチされた結果コントローラ要求を使用して、データをテーブルに正しく入力してフェッチします。しかし、この1回のデータ作成(26854オブジェクト名)からmanagedObject.name属性の重い操作にUIを解放するためのスレッドにデータがロードされると、tableviewとUIはフリーズされます(1-15秒間私は自分のデータベースのために初めてdocument.managedObjectContextに移入していると思います)。

10~15秒後にデータがロードされ、正しく表示されます。しかし、シミュレータを停止してシミュレータでアプリケーションを再起動すると、下のコードに示すようにドキュメントを保存しても、同じフェッチ結果コントローラの設定(および要求)を使用してテーブルビューに空が表示されますが、 (ドキュメントの状態がこの段階で開いて正常に表示され、ファイルのパスが同じであることを確認しました...自動保存も明示的なsaveForOverwritingもそうではありません...私は仕事を使っています...それとも何か他のものですか? 。」私はそれが私のマルチスレッドとは何かを持っていると思うすぐに夢中になるでしょう

self.managedObjectNamesテーブルビューでの配列プロパティであり、私は私のテーブルビューのloadViewメソッドの間、TXTファイルからそれを設定します。

ここに間違いを見せてくれる人がいるのですか?私はself.managedObjエンティティ作成カテゴリのメソッドのectNames。

ありがとうございます!

- (void)fetchDataIntoDocument:(UIManagedDocument *)document { 

    dispatch_queue_t fetchQ = dispatch_queue_create("Data fetcher", NULL); 
    dispatch_async(fetchQ, ^{ 

      [document.managedObjectContext performBlock:^{ 
       for (int i = 0; i < 26854; i++) { 
        [managedObject managedObjectWithId:[NSNumber numberWithInt:i] andArray:self.managedObjectNames inManagedObjectContext:document.managedObjectContext]; 
       } 
       // NSLog(@"Save baby!!?"); 
       [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil]; 
      }]; 
    }); 
    dispatch_release(fetchQ); 
} 
+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html –

答えて

0

document.managedObjectContextがNSMainQueueConcurrencyTypeで作成されていますので、あなたのUIは、10〜15秒間ブロックされている理由はあります。これは、performBlock:メソッドがメインキューで実行されることを意味します。

コードにfetchQを作成することには何の理由もありません。

dispatch_async(fetchQ, ^{ 

    // fetch data here (e.g. fetchAttribute may take few seconds) 
    NSString *attribute = fetchAttribute(); 

    [document.managedObjectContext performBlock:^{ 
     MyObject *o; 
     o = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject" 
              inManagedObjectContext:document.managedObjectContext]; 
     o.myAttribute = attribute; 
    }]; 
}); 

私はあなたの主な質問への答えを知らないしかし:データの取り込みには時間のいくつかのかなりの量を取るだろうが、それらを追加することが速くなります(例えば、わずか数のオブジェクトを作成/変更)場合は理由を持っているでしょう。