iOS Objective-C等待异步过程

问题描述 投票:4回答:3

我正在从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块中,但是由于在该块中调用而返回语法错误。

ios objective-c asynchronous while-loop wait
3个回答
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];

6
投票

您无需等待异步过程完成。这使其同步。您需要改变想法。

有多种处理异步API的方法。

  1. 传递完成块
  2. 分配一个委托并定义一个在完成时调用的方法。
  3. 在过程完成时发送通知。

毫无疑问,但是异步API的整体思想是立即返回,您不必等待它完成。正如另一个人所说,永远不要使用while(!fetchComplete)这样的代码。这是一个严重的坏主意。


1
投票

您要解决该问题的庄园有点不典型。

通常,这是通过blocksnotifications委派完成的。

这个想法是您只想在完成某些异步方法之后执行一些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

对于您的问题,授权可能是一个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.