当多个对象在iOS中调用函数时,如何等待函数完全执行?

时间:2018-12-03 06:21:51

标签: ios objective-c grand-central-dispatch

我有一个体系结构,我必须调用本地函数来显示图像,然后在后台需要将图像上传到服务器,以便上传完成后,我可以删除用于显示图像的本地路径。

功能

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,这增加了服务器的负载。在上一个调用该函数的对象完全执行之前,如何阻止该函数的调用?

1 个答案:

答案 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文档的链接。

NSOperationQueue

maxConcurrentOperationCount