Принудительное выполнение основной очереди в progressHandler (iOS) - PullRequest
0 голосов
/ 12 июня 2018

Я загружаю изображение из облака, используя requestImageDataForAsset.Я прилагаю PHImageRequestOptions с обработчиком прогресса, чтобы регулярно получать уведомления о ходе загрузки.В обработчике прогресса я рисую UIImage прогресса и обновляю UIButton этим изображением.

Однако обработчик прогресса загружается в фоновую очередь, и мне нужно обновить изображение UIButton в главном потоке.

Моя проблема в том, чтоосновной поток выполняется только после завершения полной загрузки.

Есть ли способ принудительно выполнить основной поток в данный момент?

        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.progressHandler = ^(double progress, NSError * _Nullable error, BOOL * _Nonnull stop, NSDictionary * _Nullable info) {
            NSLog(@"Progress: %f %%",progress*100.f);
            UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
            CGContextRef ctx = UIGraphicsGetCurrentContext();

            <create UIImage>
            progressImg=UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"Updating button image");
                [self->testButton setImage:progressImg forState:UIControlStateNormal];
                [self->testButton setNeedsDisplay];
            });
        };

        [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info)
        {
             <actions>
        }];

Получение вывода:

2018-06-12 10:30:34.765372+0300 App[12894:2931379] Progress: 0.000000 %
2018-06-12 10:30:34.828532+0300 App[12894:2931379] Progress: 0.000000 %
2018-06-12 10:30:35.724429+0300 App[12894:2931379] Progress: 0.000000 %
2018-06-12 10:30:41.703484+0300 App[12894:2931379] Progress: 0.042285 %
2018-06-12 10:30:44.241504+0300 App[12894:2931379] Progress: 5.973034 %
2018-06-12 10:30:44.581450+0300 App[12894:2931410] Progress: 62.652379 %
2018-06-12 10:30:44.753667+0300 App[12894:2931379] Progress: 99.009919 %
2018-06-12 10:30:44.756178+0300 App[12894:2931379] Progress: 100.000000 %
2018-06-12 10:30:44.859165+0300 App[12894:2931410] Progress: 100.000000 %
2018-06-12 10:30:44.884380+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884484+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884550+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884600+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884646+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884693+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884745+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884797+0300 App[12894:2931279] Updating button image
2018-06-12 10:30:44.884843+0300 App[12894:2931279] Updating button image

1 Ответ

0 голосов
/ 12 июня 2018

Проблема возникла из вариантов, где мне нужно было установить options.synchronous = NO

...