Синхронным обертка вокруг UIApplication.openURL:варианты:завершение:


Я умоляюще iOS 9 на проект. Одним из отличий программы является то, что метод openURL изменилось.

в iOS 9

- (BOOL)openURL:(NSURL *)url;

в iOS 10

- (void)openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options completionHandler:(void (^)(BOOL success))completion;

Обратите внимание, как способ изменен с синхронного на асинхронный.

Поскольку у меня есть куча режимов работы для синхронного метода, я хочу создать синхронную обертку асинхронного openURL:options:completion: способ, и я собираюсь обновить обычай называть эту асинхронную обертку вместо.

Моя первая попытка выглядит так:

- (BOOL)sync_openURL: (nullable NSURL *)url {
    __block BOOL result = nil;
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self openURL:url options:@{} completionHandler:^(BOOL success) {
        result = success;
        dispatch_semaphore_signal(semaphore);
    }];
    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
    }
    return result;
}

Это хорошая замена ? Это может быть все равно улучшилось в ?



231
0
задан 8 февраля 2018 в 07:02 Источник Поделиться
Комментарии
1 ответ

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

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

2
ответ дан 20 февраля 2018 в 02:02 Источник Поделиться