Ứng dụng tôi đang làm việc định kỳ làm mới bộ nhớ cache dữ liệu cục bộ từ máy chủ ứng dụng (hơn 10 yêu cầu, mỗi yêu cầu mất một lượng thời gian hợp lý). Tôi hiện đang chạy các yêu cầu này một cách không đồng bộ để không chặn luồng giao diện người dùng. Vì các yêu cầu này mất một thời gian để xử lý và sau đó tải vào dữ liệu cốt lõi, tôi muốn tận dụng hành vi hoạt động phụ thuộc của beginBackgroundTaskWithExpirationHandler
và hoạt động phụ thuộc của NSOperationQueue
.NSOperationQueue waitUntilAllOperationsAreFinished không hoạt động khi đang ở chế độ nền
Sau khi tôi đã thêm tất cả các yêu cầu vào hàng đợi hoạt động, tôi đang sử dụng waitUntilAllOperationsAreFinished
để chặn cho đến khi tất cả các thao tác được hoàn thành (điều này không nằm trong chuỗi chính). Vấn đề tôi thấy trong nguyên mẫu của tôi là khi tôi chạy ứng dụng và ngay lập tức nền nó (nhấn nút home), các waitUntilAllOperationsAreFinished
vẫn bị chặn ngay cả sau khi tất cả các hoạt động đã hoàn thành ... nhưng ngay sau khi tôi mở ứng dụng một lần nữa , xử lý kết thúc. Nếu tôi chạy ứng dụng và để nó ở lại nền trước, mọi thứ sẽ kết thúc tốt đẹp. Hành vi này dường như không xảy ra khi ở trong ứng dụng thực tế của tôi, nhưng với mã ví dụ bên dưới, có vẻ như:
#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
Tôi làm gì sai?
Cảm ơn
Ugh ... cảm ơn lol – chinabuffet