Как ждать, пока функция полностью не исполнится, когда несколько объектов вызывают функцию в iOS? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть архитектура, в которой мне нужно вызывать локальную функцию для отображения изображения, а затем в фоновом режиме необходимо загрузить изображение на сервер, чтобы после завершения загрузки я мог удалить локальный путь, используемый для отображения изображения.

Функции

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, который увеличивает нагрузку на сервер.Как я могу заблокировать вызов функции, пока предыдущий объект, который вызвал функцию, не будет полностью выполнен?

1 Ответ

0 голосов
/ 03 декабря 2018

Возможно, вы захотите взглянуть на использование 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

...