Прошу, пожалуйста, не пытаться использовать NSExceptions
для признания недействительным. Я даже не знаю, как это работает, но, пожалуйста, не пытайтесь. В отличие от других фреймворков/языков (например, Java или .NET), в Cocoa исключения обычно означают, что «что-то пошло не так, и приложение должно завершиться». (Да, существует несколько исключений из этого правила, но «просмотр недействительности» не является одним из них.)
Первое, что нужно знать, это то, что объекты пользовательского интерфейса (т.е. виды) обычно рассматриваются как основная тема только. Поэтому, если вы мутируете свою модель в фоновом потоке, недействительность представления должна быть привязана к основному потоку. У GCD есть возможности для обработки этого (dispatch_get_main_queue
), но есть и другие, такие как -[NSObject performSelectorOnMainThread:...]
и CFRunLoopPerformBlock
.
Следующее, что нужно знать, это то, что если вы собираетесь это сделать (например, прочитайте свою модель в основном потоке, чтобы заполнить пользовательский интерфейс и обновить модель из фоновых потоков), вам нужно будет иметь какую-то блокировку чтобы никакие фоновые потоки не мутировали модель, пока основной поток пытается ее прочитать. Вы можете заблокировать недействительность основного потока без блокировки, но когда взгляды перейдут на повторную проверку (т. Е. Макет и рисование), вы захотите сделать соответствующую блокировку для объектов модели, представляемых для предотвращения повреждения данных. Управление этими замками может быстро стать нетривиальным. (Хотя частные параллельные очереди НОД доступ с dispatch_(a)sync
& dispatch_barrier_(a)sync
являются очень хорошим местом для начала.)
Один общий шаблон, который позволяет избежать большинства сложности запирающего должен иметь фоновые потоки выполняют свою работу на копию модели а затем отправить не только недействительность представления, но и операцию мутации модели обратно в основной поток, поэтому с точки зрения «одной, истинной модели» она всегда является основным потоком, и в этом случае вам не нужно беспокоиться о блокировке. Если вы можете так поступать, это спасет вас от горя.
На OSX (но не на iOS) есть привязки Cocoa, в которых используется наблюдение за ключевыми значениями (с рядом непрозрачной «магии» между ними), чтобы автоматически аннулировать и обновлять связанный интерфейс при изменении модели. Связывание какао не существует на iOS, но стоит упомянуть, что KVO делает, и отправленные ему уведомления могут использоваться для аннулирования вида. Важно знать, что уведомления KVO отправляются синхронно в потоке, в котором происходит мутация, поэтому вы захотите маршализовать свои мутации обратно в основной поток.
И, наконец, использование NSNotificationCenter не освобождает вас от беспокойства по поводу блокировки и перекрестных уведомлений ни потому, что, как KVO, NSNotifications доставляются синхронно в потоке, на котором они размещаются.Отправка NSNotification в фоновом потоке, для которого есть наблюдатели UIViews, также вызовет проблемы.
спасибо за так много слов, да я меняю модель в фоновом потоке и, конечно же, отправляю NSNotification в основной поток, и я использую GCD, да, но я не вижу другой реализации, кроме NSNotificationCenter. Из курса Стэнфордского университета я узнал, что модель может уведомлять о своем состоянии с помощью KVO и уведомлений. Поэтому для работы с потоками у меня нет проблем, но NSNotificationCenter - очень сложный инструмент для понимания отношений между классами, поэтому мне нужно решить другим способом. – ShurupuS
'NSNotificationCenter' и KVO - это два механизма, предоставляемые структурами для обработки этого - Я не знаю никаких других абстрактных средств уведомления в iOS. Если ни один из них не будет работать на вас, вам, вероятно, придется написать что-то другое с нуля (и это почти наверняка не должно включать в себя «NSException'). Что касается механизмов уведомления, NSNotificationCenter довольно прост, поэтому, я думаю, я не понимаю проблему. – ipmcc
Я тоже не могу это понять, но, насколько я понимаю, это слабая точка моей тестовой задачи для моей будущей работы, спасибо, я попробую gooooogle узнать больше о MVC. – ShurupuS