Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否从后台线程更新表视图?_Objective C_Multithreading_Core Data - Fatal编程技术网

Objective c 是否从后台线程更新表视图?

Objective c 是否从后台线程更新表视图?,objective-c,multithreading,core-data,Objective C,Multithreading,Core Data,我正在尝试从核心数据更新表视图,如下所示: dispatch_queue_t request_queue = dispatch_queue_create("com.myqueue.qu", NULL); dispatch_async(request_queue, ^{ NSManagedObjectContext *parent = [[CoreDataManager instance] managedObjectContext]; NSMana

我正在尝试从核心数据更新表视图,如下所示:

    dispatch_queue_t request_queue = dispatch_queue_create("com.myqueue.qu", NULL);
    dispatch_async(request_queue, ^{

        NSManagedObjectContext *parent = [[CoreDataManager instance] managedObjectContext];
        NSManagedObjectContext *searchContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:parent.concurrencyType];
        [searchContext setPersistentStoreCoordinator:[[CoreDataManager instance] persistentStoreCoordinator]];

        NSArray * array = ...// receive array from CoreData, just select, there is no changes

        if (array.count > 0) {

            dispatch_async(dispatch_get_main_queue(), ^{
                block(array);
            });
        }
        else {
            dispatch_async(dispatch_get_main_queue(), ^{
                block(nil);
            });
        }
    });
    dispatch_release(request_queue);
在第一区:

_tableViewData = [array mutableCopy];
[self.tableView reloadData];
但在:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
我的目标:

 MyObj *obj = _tableViewData[indexPath.row];
没有字段。所以obj是空的

编辑:

我尝试在不创建“searchContext”的情况下搜索,使用parentContext和tableView更新确定,这是正确的方法吗

    dispatch_queue_t request_queue = dispatch_queue_create("com.myqueue.qu", NULL);
    dispatch_async(request_queue, ^{

        NSManagedObjectContext *parent = [[CoreDataManager instance] managedObjectContext];

        NSArray * array = ...// receive array from CoreData, using parent as search context

您不能像这样在线程之间传递托管对象。如果要在后台线程上运行搜索,应将托管对象ID传递回表视图,并让它使用ID从主线程上下文访问托管对象。当您执行后台提取时,您可以将提取配置为返回ID而不是完整对象。

谢谢您的回答,如果我在主上下文中搜索,这是正确的方法吗?我的意思是:NSManagedObjectContext*parent=[[CoreDataManager实例]managedObjectContext];不创建搜索上下文。我试过了,它更新了tableview ok。只有在主线程上运行搜索时。每个线程都应该使用自己的上下文。通过使用主线程上下文,您只是有点作弊,它可以工作,因为您不编辑任何内容,但它不推荐或不完全可靠。