2

我们面临着类似的情况。假设我们想从网络上获取数据。因此,我们从后台获取数据。之后我们回来并根据新数据更新一些视图。

我应该这样做:

__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 回答