【发布时间】:2014-06-20 06:29:25
【问题描述】:
我在 AppDelegate 中调用下面的代码:
-(void) application:(UIApplication *)application performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
-(BOOL)backgroundRefresh{
newData = false;
callStartTime = [NSDate date];
[self processAll];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while(!fetchComplete);
NSLog(@"NOW COMPLETE");
});
NSLog(@"Got here now!");
return newData;
}
对 [self processAll] 的调用会运行具有异步调用等的代码,并将继续循环直到所有活动完成,反复调用自身。所有任务完成后,fetchComplete 设置为 true。这部分工作正常。
我需要代码等待 fetchComplete 为真,然后将 bool 返回给 AppDelegate。
问题是,非常正确的是,当前检查虽然可以显示 NSLogs 等,但对于将 BOOL 返回给调用者没有用,因为该过程当前是异步的。我已将其设置为异步以便它运行,否则,我发现 processAll 代码被阻止运行。
有人可以解释一下我如何监控 fetchComplete,并且只有在这种情况下才将布尔值返回给调用函数?
我尝试在 while 返回后将 return to 移动到异步块中,但这会由于在块内调用而返回语法错误。
【问题讨论】:
-
你不能只是等待异步任务完成才能返回,毕竟这会使它同步,你必须使用一些委托或 NSNotificationCenter 来告诉相关方获取完成并获取他们的数据。
-
while(!fetchComplete);不要那样做。曾经。这是一个繁忙的轮询,它会尽可能快地旋转 CPU 的至少一个核心,而不会做任何有用的事情。它会消耗电池寿命并降低整体性能。 -
感谢 cmets 的支持。已经接受了所有这些,包括我不应该使用 while(!fecttComplete) 的事实。再次感谢您。
标签: ios objective-c asynchronous while-loop wait