私が働いているアプリは、アプリケーションサーバーからのローカルデータキャッシュを定期的に更新します(10回以上のリクエスト、それぞれにかなりの時間がかかります)。私は現在、UIスレッドをブロックしないようにこれらの要求を非同期的に実行しています。これらの要求は処理に時間がかかってコアデータに読み込まれるため、beginBackgroundTaskWithExpirationHandler
と従属操作の動作をNSOperationQueue
に利用したいと思います。NSOperationQueue waitUntilAllOperationsAreFinishedがバックグラウンドで動作していない
すべてのリクエストを操作キューに追加した後、すべての操作が完了するまでブロックされます(メインスレッドにはありません)。waitUntilAllOperationsAreFinished
を使用してブロックします。私のプロトタイプで見ている問題は、私がアプリケーションを実行して直ちに(ホームボタンを押す)、すべての操作が完了した後でも、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
は私が間違って何をしているのですか?
ありがとうございました
ええと...ありがとう笑 – chinabuffet