2015-02-05 4 views
0

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

Например:

SomeSingletonClass.sharedInstance.bFunction() 

И если это первый вызов sharedInstance, я хотел бы bFunction(), чтобы ждать, пока закрывающей * в Init() из SingletonClass заканчивается. Возможно ли как-то без блокировки пользовательского интерфейса?

* Это закрытие может показывать предупреждение авторизации доступа к гранту, а функция bFunction() должна ждать реакции пользователя на это предупреждение (или вообще не может вызывать bFunction, в зависимости от ответа пользователя).

Спасибо за любые советы в продвинутом виде.

UPDATE

Так как это было предложено GoZoner, я пытался заблокировать выполнение в методе init() с dispatch_semaphore_create()/signal()/wait(), но в этом случае приложение блокируется и не может показать AlertView.

ответ

1

Метод init() для вашего SomeSingletonClass должен будет заблокировать его выполнение до тех пор, пока не будет завершен «Предоставление авторизации доступа к гранту». По завершении процесс init() возобновляется, возвращается свойство sharedInstance и к возвращенному экземпляру применяется метод bFunction().

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

+0

Итак, я должен просто блокировать основной поток? Это хорошая идея? У меня могут быть сетевые запросы (которые начались ранее), показывая всплывающее окно. Будет ли блокировка выполнения повлиять на этот запрос (я имею в виду, может ли это вызвать Тайм-аут запроса, например?). Или я должен выполнить всю строку кода в другом потоке? – danieltmbr

+0

Если вы должны называть 'bFunction()' прикованным, как вы показали, вам нужно заблокировать все вызовы, которые вызывается при вызове 'init()'. Другой вариант - использовать обратные вызовы в вашем «Предупреждении» (или других действиях пользовательского интерфейса). – GoZoner

0

Рассматривали ли вы, что ваш код

SomeSingletonClass.sharedInstance.bFunction() 

Может быть в состоянии жить в потоке, отличном от основного потока?

Таким образом, функция sharedInstance (которая инициализирует SomeSingletonClass) может запросить основной поток асинхронно создать инициализированное значение, а семафор ждать на его завершении?

Таким образом, вы не блокируете основной поток.

1

Вы можете разместить NSNotification от закрытия NSNotificationCenter.defaultCenter().postNotificationName("weirdKeyName", object: nil)

И слушать, что уведомления и вызвать ваше предупреждение или то, что вам нужно сделать, когда код закрытия была выполнена, как только поступает уведомление: NSNotificationCenter.defaultCenter().addObserver(self, selector: "alertFunction", name: "weirdKeyName, object: nil)

alertFunction() { 
    ... 
} 

Ожидание NSNotification для запуска вашего предупреждения не приведет к блокировке вашего приложения и дождитесь завершения закрытия.

Кроме того, если вы хотите так, вы можете отправить уведомление фонового потока с NSNotificationQueue

Смежные вопросы