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; 
    }]; 
}); 

但是我不知道答案,你的主要问题。