Должны ли мои методы делегирования iOS всегда возвращаться в основной поток?

Это вопрос «лучшей практики», который я не могу найти, чтобы найти хороший ответ для онлайн. Я создаю статическую библиотеку кода, которая предоставляет несколько методов делегатов для отслеживания прогресса среди других вещей.

Библиотека управляет собственными очередями, поэтому такие вещи, как загрузки, не выполняются в основном потоке, но мой вопрос в том, должен ли я обеспечить, чтобы мои методы-делегаты всегда вызывались в основном потоке или допустимо вызывать их из очереди в очереди I я использую? и полагаться на разработчика, который использует библиотеку, чтобы проверить, что он в основном потоке, если он хочет делать обновления пользовательского интерфейса в моих методах делегата?

Привет, Сэм

3 Solutions collect form web for “Должны ли мои методы делегирования iOS всегда возвращаться в основной поток?”

Вы можете сделать это в любом случае; вам просто нужно документировать это.

Некоторые API перейдут к основному потоку, некоторые из потоков (или runloop), которые вы использовали для начала работы, а другие вообще не предоставляют никаких гарантий. Некоторые даже позволят вам пройти в очередь GCD, которая используется для всех обратных вызовов.

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

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

Когда я создал свой собственный менеджер загрузки, я продолжал метод делегирования, обращаясь к второму потоку, который запускал экземпляры объектов подключения, но это было потому, что у меня был «контроллер», который отправлял блоки успеха на основном потоке. На мой взгляд, зависит от того, на каком уровне вы участвуете в библиотеке, если вы считаете, что в большинстве случаев делегат будет вызывать метод с подпрограммами, которые включают объекты UIKit, поскольку они не являются потокобезопасными, я выберу их для отправки по основному потоку. Если вы считаете, что после делегирования пользователь вашей библиотеки может продолжить разработку данных, я предпочту остаться в другом потоке, но четко укажу на документацию. Существует еще один момент: скорость, в зависимости от трех приоритетов, вторичный поток может быть очень медленным.
[РЕДАКТИРОВАТЬ]
В диспетчере загрузки KVO или уведомление – лучший способ обработки соединений, как заявил Куинн из Apple Engineer в видео WWDC.

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

предположим, что вы загружаете данные в очередь, при загрузке данных вы вызываете метод делегата, передавая его определенному объекту класса пользователя, поэтому он должен быть в основном потоке.

  • Синхронная связь с использованием GCDAsyncSocket
  • iPhone - GCD проверяет, приостановлена ​​ли очередь
  • Загрузка изображения в UITableViewCell асинхронно
  • Objective-C, отмените очередь отправки, используя событие пользовательского интерфейса
  • Отображение нескольких видов последовательно с использованием GCD
  • Как создать массив dispatch_block_t в Swift 2.0?
  • Производительность MKOverlayView
  • Как остановить / отменить / приостановить / возобновить задачи в очереди GCD
  • Загрузка файлов в последовательном порядке с использованием NSURLConnection в iOS
  • dispatch_once в суперклассе?
  • Обходной путь по ограничению потоков в Grand Central Dispatch?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.