我有一个体系结构,我必须调用本地函数来显示图像,然后在后台需要将图像上传到服务器,以便上传完成后,我可以删除用于显示图像的本地路径。
功能
DidCmpletePickingImage()
,DisplayImageUsingLocalPath()
,UploadImageToServer()
和RemoveImageFromLocal()
。
这些是活动。现在,我可以选择上传多张图片。
这是我目前的做法。我从中选择图像数组,然后调用函数使用本地路径显示它们。
for (NSInteger i = 0;i < photos.count ; i ++){
UIImage *img = photos[i];
img = [self imageWithImage:img scaledToWidth:400];
NSData *imageData = UIImageJPEGRepresentation(img, 0.40);
[self showLocally:imageData img:img];
}
显示它们之后,我开始将它们上传到后台线程的服务器上
-(void) showLocally:(NSData *)imageData img:(UIImage *)img{
// Code for showing it using temp path.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
[self fileUpload:img];
});
}
然后使用后台线程将文件通过AFNetwork上传到服务器,然后在我收到响应后,我致电删除本地文件路径。
但是当我在Background上调用时,所有图像都同时在调用fileUpload
方法并执行concurrently
,这增加了服务器的负载。在上一个调用该函数的对象完全执行之前,如何阻止该函数的调用?
答案 0 :(得分:2)
您可能想看看将NSOperationQueue与maxConcurrentOperationCount结合使用-限制可以一次执行的所有操作的数量。
这是我的意思的一个小例子:
#import "ViewController.h"
@interface ViewController ()
@property (strong, nullable) NSOperationQueue *imageUploaderQ;
- (void)_randomOperationWithDelayOutputtingInteger:(NSInteger)intToOutput;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.imageUploaderQ = [[NSOperationQueue alloc] init];
// you can experiment with how many concurrent operations you want here
self.imageUploaderQ.maxConcurrentOperationCount = 3;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
for (NSInteger index = 0; index < 100; index++) {
[self.imageUploaderQ addOperationWithBlock:^{
[self _randomOperationWithDelayOutputtingInteger:index];
}];
}
}
- (void)_randomOperationWithDelayOutputtingInteger:(NSInteger)intToOutput {
// simulating taking some time to upload
// don't ever explicitly call sleep in your actual code
sleep(2);
NSLog(@"Integer output = %li", intToOutput);
}
@end
这里是
上Apple文档的链接。