Выполнение вызова функции блокировки в Objective-C - PullRequest
0 голосов
/ 12 апреля 2019

Скажем, у меня есть какая-то функция, которая должна выполнять некоторую асинхронную операцию; последовательность выглядит так:

-(void) f1 {
    //1. invoke some asynchronous operation 

    //2. wait until asynchronous operation ends and invokes some delegate method 

    //3. let delegate method end

    //4. exit function
}

Функция вызывается с использованием очереди GCD (последовательной или параллельной).

Ограничения : уведомления не могут быть использованы; шаги должны быть строго в этом порядке; NSOperation не должен использоваться;

Как можно реализовать блокирующую часть (# 2 в последовательности)?

1 Ответ

1 голос
/ 12 апреля 2019

Возможно, вы могли бы использовать Семафоры GCD :

@interface MyClass
@property (strong) dispatch_semaphore_t semaphore;
@end

@implementation MyClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        _sempahore = dispatch_semaphore_create(0);
    }
    return self;

}

- (void)blockingMethod
{
    // let's assume someThing somehow already exists :)
    someThing.delegate = self;
    [someThing doAsyncStuff]; // will call someThingDelegateCallback when done

    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
}

- (void)someThingDelegateCallback
{
    dispatch_semaphore_signal(self.semaphore);
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...