我们面临着类似的情况。假设我们想从网络获取数据。因此,我们从后台获取数据。之后,我们返回并根据新数据更新一些 View 。
我应该这样做吗:
__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();
});
}
最佳答案
这是一个如何使用 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
});
});
关于objective-c - 在后台做一些事情,一旦完成,在前台做其他事情吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10680871/