Должны ли мои блочные методы возвращаться в основной поток или нет при создании инфраструктуры интеграции с iOS? - PullRequest
2 голосов
/ 11 октября 2011

Я нахожусь в процессе создания инфраструктуры облачной интеграции для iOS.Мы позволяем сохранять, запрашивать, подсчитывать и удалять синхронно и асинхронно с помощью селектора / обратного вызова и реализации блоков.Какова правильная практика?Запускать блоки завершения в основном потоке или в фоновом потоке?

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Для простых случаев я просто параметризирую его и выполняю всю работу, которую могу, во вторичных потоках:

  • По умолчанию обратные вызовы будут выполняться в любом потоке (где это наиболее эффективно).и прямой - обычно после завершения операции).Это значение по умолчанию, потому что обмен сообщениями через main может быть довольно дорогим.

  • Клиент может опционально указать, что сообщение должно быть сделано в главном потоке.Таким образом, требуется одна строка или аргумент.Если безопасность важнее, чем эффективность, вы можете инвертировать значение по умолчанию.

  • Вы также можете попытаться объединить и объединить некоторые сообщения или просто использовать таймер на главном прогоне.цикл к продавцу.

  • Рассмотрите как объединенные, так и отсоединенные модели для некоторых ваших работ.

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

0 голосов
/ 11 октября 2011

Класс Apple NSURLConnection вызывает его методы-делегаты в потоке, из которого он был инициирован, в то же время выполняя свою работу в фоновом потоке. Это похоже на разумную процедуру. Вероятно, пользователю вашей инфраструктуры не понравится заботиться о безопасности потоков при написании простого блока обратного вызова, как если бы вы создали новый поток для его запуска.

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

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

...