我正在从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为真,然后将布尔值返回给AppDelegate。
问题是,正确的是,当前检查虽然可以显示NSLogs等,但是由于该进程当前是异步的,因此没有必要将BOOL返回给调用方。我已将其设置为异步以便它可以运行,否则,我发现processAll代码被阻止运行。
有人可以告诉我如何监视fetchComplete,只有在这是真的之后,才能将布尔值返回到调用函数吗?
我已经尝试在返回while之后将return移到async块中,但是由于在该块中调用而返回语法错误。
使用通知。首先,您必须像这样开始收听通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(fetchDidComplete)
name:@"fetchDidComplete"
object:nil];
无论将fetchComplete设置为true的地方,都发出这样的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"fetchDidComplete"
object:self
userInfo:nil];
然后,您应该有一个名为fetchDidComplete的方法,它将完成后期工作。完成后,别忘了停止收听通知。
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"fetchDidComplete"
object:nil];
您无需等待异步过程完成。这使其同步。您需要改变想法。
有多种处理异步API的方法。
毫无疑问,但是异步API的整体思想是立即返回,您不必等待它完成。正如另一个人所说,永远不要使用while(!fetchComplete)
这样的代码。这是一个严重的坏主意。
您要解决该问题的庄园有点不典型。
通常,这是通过blocks
或notifications
委派完成的。
这个想法是您只想在完成某些异步方法之后执行一些function
。
假设我们有一个名为AyncProcessor的异步处理器。
AyncProcessor * processor = [AyncProcessor sharedProcessor];
processor.delegate = self;
[processor start];
是进行委托的相当普遍的方式。这里的假设是存在一个用回调方法定义的协议,该协议在完成时运行。
//protocol method
-(void) processingComplete;
// and at some point in AsyncProcessor
[self.delegate processingComplete]
有关授权here的更多信息
也可以使用块
AyncProcessor * processor = [AyncProcessor sharedProcessor];
[processor start:^()/{
///code in this block will complete after processing has completed
}];
有关块的更多信息,请参见here
并且如已经显示的,您可以发送NSNotification
。
对于您的问题,授权可能是一个好主意。