Как реализовать семафоры в iOS-приложении? - PullRequest
5 голосов
/ 10 января 2012

Возможно ли реализовать счетный семафор в приложении ios?

Ответы [ 4 ]

14 голосов
/ 10 января 2012

Да, это возможно.Доступно немало инструментов синхронизации:

  • @ synchronized
  • NSLock
  • NSCondition
  • NSConditionLock
  • семафоры GCD
  • pthread блокируется
  • ...

Я бы предложил прочитать " Руководство по программированию потоков " и задать что-то более конкретное.

7 голосов
/ 25 июня 2015

Как это:

dispatch_semaphore_t sem = dispatch_semaphore_create(0);

[self methodWithABlock:^(id result){
    //put code here
    dispatch_semaphore_signal(sem);

    [self methodWithABlock:^(id result){
        //put code here
        dispatch_semaphore_signal(sem);
    }];
}];

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

Кредит http://www.g8production.com/post/76942348764/wait-for-blocks-execution-using-a-dispatch

4 голосов
/ 08 марта 2014

Мне не удалось найти собственный объект IOS для этого, но он прекрасно работает с библиотекой C:

#import "dispatch/semaphore.h"
...
dispatch_semaphore_t activity;
...
activity = dispatch_semaphore_create(0);
...
dispatch_semaphore_signal(activity);
...
dispatch_semaphore_wait(activity, DISPATCH_TIME_FOREVER);

Надеюсь, это поможет.

3 голосов
/ 15 декабря 2016

В Swift 3 вы можете использовать <a href="https://developer.apple.com/reference/dispatch/dispatchsemaphore" rel="nofollow noreferrer">DispatchSemaphore</a>.

// initialization
let semaphore = DispatchSemaphore(value: initialValue)

// wait, decrement the semaphore count (if possible) or wait until count>0
semaphore.wait()

// release, increment the semaphore count
semaphore.signal()
...