1

预取数据并在 uitableview 上显示时出现问题。所以基本上我想阻止主 UI 线程,以便我可以从 web 获取数据。我正在使用串行调度队列进行同步。此外,调度队列块正在执行另一个从 Web 获取数据的块。执行的代码写在viewdidload中:

dispatch_queue_t queue= dispatch_queue_create("myQueue", NULL);


CMStore *store = [CMStore defaultStore];

// Begin to fetch all of the items
dispatch_async(queue, ^{

[store allObjectsOfClass:[Inventory class]
       additionalOptions:nil
                callback:^(CMObjectFetchResponse *response) {

                    //block execution to fetch data

                }];
});
dispatch_async(queue, ^{
//load data on local data structure


    [self.tableView reloadData];
});
4

1 回答 1

8

除了在主线程/队列中之外,您永远不应该在任何地方执行任何与 UI 相关的代码。

始终在主线程/队列上执行所有与 UI 相关的代码(例如reloadData在 上)。UITableView在您的示例中,我猜您还应该仅在获取数据时才重新加载表格视图,因此在完成块中,而不是在调用回调之前。

// Begin to fetch all of the items
dispatch_async(queue, ^{
   [store allObjectsOfClass:[Inventory class]
       additionalOptions:nil
                callback:^(CMObjectFetchResponse *response) {

                // block execution to fetch data
                ...
                // load data on local data structure
                ...

                // Ask the main queue to reload the tableView
                dispatch_async(dispatch_get_main_queue(), ^{
                    // Alsways perform such code on the main queue/thread
                    [self.tableView reloadData];
                });
    }];
});
于 2012-10-13T17:37:24.150 回答