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

标签 ios objective-c grand-central-dispatch

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

功能
DidCmpletePickingImage()DisplayImageUsingLocalPath()UploadImageToServer()RemoveImageFromLocal()

这些是 Activity 。现在,我可以选择上传多个图像。

这是我目前的做法。我从中选择图像数组,然后调用函数使用本地路径显示它们。

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将文件上传到服务器,然后在得到响应后,我调用remove local file path。

但是,当我在Background上调用时,所有图像都同时在调用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

以下是有关Apple文档的链接:

NSOperationQueue

maxConcurrentOperationCount

关于ios - 当多个对象在iOS中调用函数时,如何等待函数完全执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53588476/

相关文章:

ios - 设置 UIImage 动画的正确/干净的方法?

objective-c - 为什么我在 objective-c 中得到一个整数到指针的转换错误?

swift - 如何链接完成?

ios - 加拿大数据和 iOS 推送通知

ios - 自动 UITableViewCell 高度的奇怪结果

objective-c - 将 UIImages 导出到 MP4

ios - Swift - 缓慢的 UITableView 滚动(从设备存储加载图像)

swift - 从后台获取 NSObjects 时应用程序崩溃

ios - SwiftUI 如何在 NavigationView 中强制导航栏分隔线

ios - Pod-Facebook-iOS-SDK : Warning for `selection` & `allowsMultiple`