iOS Objective C等待异步进程

时间:2014-05-03 16:57:50

标签: ios objective-c asynchronous while-loop wait

我在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为true,然后将bool返回给AppDelegate。

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

有人可以了解一下我如何监控fetchComplete,只有一次是真的将bool返回给调用函数吗?

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

非常感谢。

3 个答案:

答案 0 :(得分:6)

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

有许多不同的方法可以处理异步API。

  1. 通过完成块
  2. 分配一个委托并定义一个在完成时调用的方法。
  3. 在流程完成时发送通知。
  4. 毫无疑问更多,但异步API的整个想法是它立即返回,你不要等待它完成。正如另一个人所说,永远不会使用像while(!fetchComplete)这样的代码。这是一个非常糟糕的主意。

答案 1 :(得分:5)

使用通知。首先,你必须开始听这样的通知

[[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];

答案 2 :(得分:1)

你试图解决这个问题的庄园有点不典型。

通常,这可以通过委派,blocksnotifications完成。

您只想在完成某些异步方法之后执行一些function

假设我们有一个名为 AyncProcessor 的asyc处理器。

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

对于你的问题,代表团可能是一个好主意。