1

データのプリフェッチと uitableview での表示に問題があります。基本的に、Web からデータを取得できるように、メインの UI スレッドをブロックしたいと考えています。同期にシリアル ディスパッチ キューを使用しています。また、ディスパッチ キュー ブロックは、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 関連コード ( など) は、常にメイン スレッド/キューで実行reloadDataUITableViewます。あなたの例では、コールバックが呼び出される前ではなく、完了ブロックで、データがフェッチされたときにのみテーブルビューをリロードする必要があると思います。

// 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 に答える