iOS Objective-C 等待异步进程

标签 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 为真,然后返回一个 bool 值给 AppDelegate。

问题是,当前的检查虽然可以显示 NSLogs 等,但对于将 BOOL 返回给调用者毫无用处,因为该进程当前是异步的。我已将它设置为异步以便它运行,否则,我发现 processAll 代码被阻止运行。

有人可以阐明我如何监控 fetchComplete,并且只有在监控为真时才将 bool 返回给调用函数吗?

在 while 返回后,我尝试将 return 移到异步 block 中,但由于在 block 内调用,这会返回语法错误。

最佳答案

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

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

关于iOS Objective-C 等待异步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447325/

相关文章:

c# - 关于异步/任务的初学者

android - Firebase Crashlytics 有替代品吗?

ios - 支持的方向与应用程序没有共同的方向,shouldAutorotate 在 xamarin iOS 中返回 YES'

ios - executeFetchRequest:错误:在主线程上卡住

objective-c - iTunes 文件共享应用 : realtime monitoring for incoming datas

javascript - IE 中的异步 Google map 加载错误

javascript - mongoose:如何循环包含对象引用(_id)的数组

iphone - 如何在 iPhone 上以卡拉 OK 风格显示歌词?

ios - IOS Safari 自定义字体渲染

ios - 即使在后台线程上,将 UIImage 写入文件也会锁定 UI