【发布时间】:2018-03-09 17:42:56
【问题描述】:
我有 x 个需要运行的不同任务。每个任务负责上网,下载一些数据,处理这些数据,然后保存这些数据。
它们都在后台线程上同时运行。虽然我可以让他们一个接一个地跑。
当所有 4 项任务都完成后,我希望收到通知,他们已以某种方式完成。
但是,NSOperationQueue 在任何其他实际操作开始之前就触发了已完成的队列。
当前设置的我的日志:
fetchMyData:completionOperation YES
文件:MySet1 已创建
文件:MySet2 已创建
文件:MySet3 已创建
文件:MySet4 已创建
有没有更好的方法将操作链接在一起并在触发最终操作之前完全等待所有操作完成?
这是我正在做的事情:
- (void) timeToUpdate {
[self fetchMyData:^(BOOL done) {
NSLog(@"fetchMyData: completionOperation : %@", done ? @"YES":@"NO");
}];
- (void) fetchMyData: (void(^)(BOOL done)) completion {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"fetchMyData: completionOperation");
completion(true);
}];
NSOperation *operation;
operation = [NSBlockOperation blockOperationWithBlock:^{
[self downloadDataSet:@"MySet1"];
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
[self downloadDataSet:@"MySet2"];
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
[self downloadDataSet:@"MySet3"];
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
[self downloadDataSet:@"MySet4"];
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
[queue addOperation:completionOperation];
}
//The below is just abstract sudo code that works and does its job of downloading, processing and saving the data.
- (void) downloadDataSet:(SomeSet) {
[NSURLSessionUploadTask uploadTaskWithRequest:task
fromData: Someset
completionHandler: {
process(set);
}]
}
- process:(data) {
doSomethignWithData(data)
//then
write(data)
}
- write(data) {
//save to file system, sql, coredata whatever
if(success){
NSLog(@"FILE: data CREATED");
}
}
【问题讨论】:
标签: ios objective-c objective-c-blocks nsoperationqueue nsoperation