0

json データがあり、テーブル ビューにプッシュしたいのですが? しかし、最初はjsonデータを取得する必要があるため、バックグラウンドでデータをロードしてプッシュできるように、どのディスパッチメソッドまたは子スレッドが推奨されます。

4

1 に答える 1

0

ベスト プラクティスは、dispatch_async メソッドを使用してバックグラウンド スレッドでデータをロードし、メイン以外のキューを渡して UI をブロックしないようにすることです。データの準備ができたら、メイン スレッドでリロード テーブル ビューを呼び出すだけです...実際のプロジェクト... クラス レベルのメソッド ロード トランザクション

+ (void)getAllTransactionsWithHandler:(void(^)(NSArray *transactions, NSError *error))handler{
    dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(q, ^{
        NSURL *url = [[NSBundle mainBundle] URLForResource:trnasactionFileName withExtension:@"json"];//[NSData dataWithContentsOfFile:trnasactionFileName];
        NSData *data = [NSData dataWithContentsOfURL:url];
        if (!data) {
            if (handler) {
                handler(nil, [NSError errorWithDomain:@"bank" code:900 userInfo:nil]);
            }
            return ;
        }
        NSError *error = nil;
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        if (error) {
            if (handler) {
                handler(nil, error);
            }
        }
        else{
            Transaction *transaction;
            NSString *dateString;
            NSMutableArray *objects = [NSMutableArray new];
            for (NSDictionary *dic in jsonArray) {
                transaction = [Transaction new];
                 dateString = dic[kOccured];
                NSDateFormatter *dateFormater = [NSDateFormatter new];
                [dateFormater setDateFormat:@"yyyy-MM-dd"];
                transaction.occured = [dateFormater dateFromString:dateString];
                transaction.proecessed = [dateFormater dateFromString:dic[kProcessed]];
                transaction.desc = dic[kDescription];
                transaction.amount = dic[kAmount];
                [objects addObject:transaction];
            }
            if (handler) {
                handler([NSArray arrayWithArray:objects], nil);
            }
        }

    });
}

これを次のように使用できます

 [Transaction getAllTransactionsWithHandler:^(NSArray *transactions, NSError *error) {
        if (error) {

        }else{
            if ([transactions count] > 0) {
                weakSelf.objects = transactions;
                runOnMainThread(^{
                    [weakSelf.tableView reloadData];
                });


            }
        }
    }];

runOnMainthread は、提供されたコード ブロックをメイン スレッドで実行するユーティリティ メソッドです。

void runOnMainThread(void(^block)(void)){
    if ([[NSThread currentThread] isMainThread])
        block();
    else{
        dispatch_sync(dispatch_get_main_queue(), ^{
            block();
        });
    }
}
于 2014-10-03T18:34:58.517 に答える