iOS Objective C等待异步进程

Nei*_*Net 4 asynchronous objective-c while-loop wait ios

我在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;
}
Run Code Online (Sandbox Code Playgroud)

对[self processAll]的调用运行具有异步调用等的代码,并将继续循环,直到所有活动完成,重复调用自身.完成所有任务后,fetchComplete将设置为true.这部分工作正常.

我需要代码等待fetchComplete为true,然后将bool返回给AppDelegate.

问题是,非常正确的是,当前检查虽然它可以显示NSLog等,但是将BOOL返回给调用者是没有用的,因为该进程当前是异步的.我已将其设置为异步以便它运行,否则,我发现processAll代码被阻止运行.

有人可以说明如何监视fetchComplete,只有一次是真的将bool返回给调用函数?

我已经尝试在返回while之后将返回移动到异步块,但是由于在块内调用,这会返回语法错误.

非常感谢.

Dun*_*n C 6

您不必等待异步过程完成.这使它同步.你需要改变你的想法.

有许多不同的方法来处理异步API.

  1. 通过完成块
  2. 分配委托并定义在完成时调用的方法.
  3. 该过程完成后发送通知.

毫无疑问,更多,但异步API的整个想法是它立即返回,你不要等待它完成.正如另一个人所说,永远不会使用像while(!fetchComplete).这是一个非常糟糕的主意.


Zia*_*Zia 5

使用通知.首先,您必须开始像这样听通知

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fetchDidComplete)
                                             name:@"fetchDidComplete"
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

无论你将fetchComplete设置为true,都要发布这样的通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"fetchDidComplete"
                                                    object:self
                                                  userInfo:nil];
Run Code Online (Sandbox Code Playgroud)

那么你应该有一个名为fetchDidComplete的方法来完成完成后的工作.完成后不要忘记停止收听通知.

[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:@"fetchDidComplete"
                                              object:nil];
Run Code Online (Sandbox Code Playgroud)

  • 还要确保您在主线程上发布通知. (2认同)