在实际项目开发中,你可能会遇到这样一个需求——举报功能,要求可上传多张图片到阿里云OSS,图片上传完毕之后再调用自己服务器接口。那么如何做到等待多张图片上传完毕再调用后台接口?下面列举一种做法(当然还有其他做法),使用NSBlockOperation
类。
举个例子
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"开始上传第1张图片......%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:10];
NSLog(@"第1张图片上传完毕......%@", [NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"开始上传第2张图片......%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:7];
NSLog(@"第2张图片上传完毕......%@", [NSThread currentThread]);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
[queue addOperation:op1];
[queue addOperation:op2];
//[op2 addDependency:op1];//可以添加依赖关系,即op2需要等待op1请求完才发送请求
[queue addOperationWithBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
//回主线程提示上传成功
};
}];
注意:
NSOperationQueue
类的maxConcurrentOperationCount属性。该属性用于设置开启线程的个数;
1>当值为NSOperationQueueDefaultMaxConcurrentOperationCount
或大于1时(默认值),是并行队列,意味着图片1和图片2能够同时上传,谁都不用等谁上传完再上传。
2>当值为1时,是串行队列,图片则是一张张的上传,图1没上传完,图2就只能等着。
提示
线程之间也是可以添加依赖的,例如你要求图片2要等待图片1 上传完毕之后才能上传,代码如下:
[op2 addDependency:op1];
相关文章
iOS开发多线程篇—NSOperation基本操作
iOS多线程:『GCD』详尽总结
IOS 多线程信号量的用法(解决异步线程中的线程等待问题)