我有一个架构,我必须调用本地函数来显示图像,然后在后台需要将图像上传到服务器,这样一旦上传完成,我就可以删除用于显示图像的本地路径。
功能
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将文件上传到服务器,然后在我得到响应后,我调用删除本地文件路径。
但当我在后台调用时,所有的图像都同时调用fileUpload
方法和concurrently
方法,这增加了服务器上的负载。如何阻止对函数的调用,直到调用该函数的前一个对象完全执行为止?
您可能希望了解将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
以下是苹果文档的链接
NSOperationQueue
最大并发操作计数