2

私たちは同様の状況に直面しています。Web からデータを取得したいとします。そのため、バックグラウンドからデータを取得します。その後、新しいデータに基づいていくつかのビューを更新します。

私はこれを行う必要があります:

__block NSDictionary * dic = nil;
__block NSObject* lock = [[NSObject alloc]init];

[Tools doBackground:^{
    @synchronized (lock) {
        dic=(NSDictionary *)[GrabClass JsonParser:alamat];
    }
}];
@synchronized (lock)
{
}

NSString *countView= [[dic objectForKey:[BNUtilitiesQuick currentBusiness].ID] objectForKey:@"CountViews"];

... かくかくしかじか

または私はするべきですか

[Tools doBackground:^{
        dic=(NSDictionary *)[GrabClass JsonParser:alamat];
    //}
    [Tools doForeGround:^{
        NSString *countView= [[dic objectForKey:businessReviewed.ID] objectForKey:@"CountViews"];

        CLog(@"countView:%@", countView);
        NSString *countReview=[[dic objectForKey:businessReviewed.ID] objectForKey:@"Review"];

もちろん:

NSString *countReview=[[dic objectForKey:businessReviewed.ID] objectForKey:@"Review"];dic=(NSDictionary *)[GrabClass JsonParser:alamat];言うまでもなく、終了 後に呼び出す必要があります。

また、これは doForeGround と doBackGround の定義です

+(void)doForeGround:(void (^)())block
{
    dispatch_async(dispatch_get_main_queue(), ^{
        block();
    });
}

+(void)doBackground:(void (^)())block
{
    //DISPATCH_QUEUE_PRIORITY_HIGH
    //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
    dispatch_async(dispatch_get_global_queue(-2,0), ^{
        block();
    });
}
4

1 に答える 1

2

これはGCDの使い方の簡単な例です

dispatch_queue_t queue;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

    //Do stuff async in the backbround
    dispatch_async(queue, ^{

        dispatch_sync(queue, ^{
            //Fetch data sync. When its done... update.
        });

        //Update on the main thread
        dispatch_sync(dispatch_get_main_queue(), ^{
            //Do some updates
        });
    });
于 2012-05-21T07:35:31.697 に答える