0

以下代碼是我的tableViewController的數據(第一次填充數據)的一部分。我正在使用NSManagedDocument的managedObjectContext填充(預填充)我的數據庫。源代碼是一個數組,我從我的TXT文件中清除,該文件直接放在Xcode的資源文件夾中。創建後,我有文檔案例如關閉/開放和正常。核心數據代碼和多線程

以下代碼使用提取的結果控制器請求正確輸入並將我的數據提取到表上。但是,當數據在線程中加載時,意圖將UI從此一次性數據創建(26854對象名稱)中解放到managedObject.name屬性繁重操作中,則tableview和我的UI將被凍結(1-15秒是我想,而我的數據庫首次填充document.managedObjectContext)。

10-15秒後,數據被加載並顯示正確。但是,當我停止模擬器並在模擬器中重新啓動應用程序時,儘管我保存了以下代碼中看到的文檔,並且我使用相同的讀取結果控制器設置(和請求),但表視圖顯示爲空,在此情況下它是可移動的(文檔狀態在這個階段顯示爲開放和正常,文件路徑是相同的,我檢查了...似乎既不autosave也不顯式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 – 2017-04-21 22:36:32

回答

0

您的用戶界面被阻塞10-15秒的原因是因爲document.managedObjectContext已使用NSMainQueueConcurrencyType創建。這意味着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; 
    }]; 
}); 

但是我不知道答案,你的主要問題。