1

データのgetterメソッドで配列にデータを非同期的にロードしています。

まず第一に、それは空の配列を生成するので、当然私のテーブルは0行をロードします。

データの読み込みが完了したらreloadData、テーブルを更新するために呼び出しますが、ダウンロードされるデータと表示されるデータの間に最大6秒のギャップがあるようUITableViewです。

誰かがこれが起こるかもしれない理由を知っていますか?

dispatch_async優先度の高い方法を使用しています。

データのロードと挿入のプロセスの各ポイントをログに記録しましたが、これが示されています。

また、データが読み込まれているときにテーブルを上下にスクロールし続けると、挿入の間にこのギャップがあるのではなく、テーブルにデータが表示されます。

コード:

- (NSMutableDictionary *)tableDictionary {
    if (!_tableDictionary) {
        _tableDictionary = [NSMutableDictionary dictionary];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSString *URLString = @"http://www.urlToData.com/path/to/file.php?foo=bar";

            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URLString]];
            NSError *error = nil;

            NSDictionary *objectIDs = [NSJSONSerialization JSONObjectWithData:data options:NSJSONWritingPrettyPrinted error:&error];

            NSMutableDictionary *objects = [NSMutableDictionary dictionary];

            for (NSInteger i = 0; i < objectIDs.allValues.count; i++) {
                NSArray *eventIDs = (objectIDs.allValues)[i];
                NSString *eventType = (objectIDs.allKeys)[i];

                [objects setValue:[myObject initWithIDs:objectIDs] forKey:@"key"];
            }

            self.tableDictionary = objects;
            self.titlesForSectionHeader = objects.allKeys;

            NSLog(@"Done");
            [self.tableView reloadData];
        });
    }
    return _tableDictionary;
}
4

2 に答える 2

1

次のように、テーブルビューのデータをメインスレッドにリロードしてみてください。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        //background processing goes here
        //This is where you download your data
        dispatch_async(dispatch_get_main_queue(), ^{
            //update UI here
            [self.tableView reloadData];
        });
});
于 2012-09-22T00:05:07.833 に答える
0

@danielbeard によるコードのわずかな変更として。現在のオブジェクトに影響を与えるすべてのコードをメイン キューで実行することをお勧めします。これにより、KVO または設定されたプロパティによって UI が更新された場合に、予期せぬ事態が発生するのを防ぐことができます。

最後に、DISPATCH_QUEUE_PRIORITY_HIGH は使用しません。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Stuff 'n stuff

    dispatch_async(dispatch_get_main_queue(), ^{
        self.tableDictionary = objects;
        self.titlesForSectionHeader = objects.allKeys;

        NSLog(@"Done");
        [self.tableView reloadData];
    });
});
于 2012-09-22T00:21:56.507 に答える