我正在开发的应用程序会定期从应用程序服务器刷新其本地数据缓存(10 多个请求,每个请求都需要相当长的时间)。我目前正在异步运行这些请求,以免阻塞 UI 线程。beginBackgroundTaskWithExpirationHandler
由于这些请求确实需要一段时间来处理然后加载到核心数据中,我想利用NSOperationQueue
.
在我将所有请求添加到操作队列后,我使用waitUntilAllOperationsAreFinished
to 阻塞直到所有操作完成(这不在主线程上)。我在原型中看到的问题是,当我运行应用程序并立即将其后台运行(按主页按钮)时,waitUntilAllOperationsAreFinished
即使在所有操作完成后仍然被阻止......但是一旦我再次打开应用程序,处理程序完成。如果我运行该应用程序并让它保持在前台,一切都会很好。在我的实际应用程序中,这种行为似乎并不总是发生,但使用下面的示例代码,它似乎:
#import "ViewController.h"
@interface ViewController ()
@property (assign, nonatomic) UIBackgroundTaskIdentifier task;
@property (strong, nonatomic) NSOperationQueue *queue;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSelectorInBackground:@selector(queueItUp) withObject:nil];
}
- (void)queueItUp {
UIApplication *application = [UIApplication sharedApplication];
self.queue = [[NSOperationQueue alloc] init];
self.task = [application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Took too long!");
[self.queue cancelAllOperations];
[application endBackgroundTask:self.task];
self.task = UIBackgroundTaskInvalid;
}];
for (int i = 0; i < 5; i++) {
[self.queue addOperationWithBlock:^{
[NSThread sleepForTimeInterval:3];
NSLog(@"Finished operation.");
}];
}
NSLog(@"Waiting until all operations are finished.");
[self.queue waitUntilAllOperationsAreFinished];
[application endBackgroundTask:self.task];
self.task = UIBackgroundTaskInvalid;
NSLog(@"All done :)");
}
@end
我究竟做错了什么?
谢谢