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

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

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

Привет, Сэм

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

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

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

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

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

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

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

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

  • Синхронизация отправки в текущей очереди
  • вызов веб-сервисов с помощью asynchImageView
  • Перезагрузить UICollectionViewCell, у которого есть изображение
  • ios: блоки очереди в фоновом режиме и выполняются, когда сеть становится доступной
  • iPhone - GCD проверяет, приостановлена ​​ли очередь
  • dispatch_async в исполнении NSManagedObjectContext
  • Как указать типы возврата в блоках GCD
  • Сделать все конечные точки ожидания одной точной конечной точкой
  • GCD и потоки
  • Получить метку GCD в Swift 3
  • Обновления ios coredata не отображаются в разных контекстах управляемых объектов - данные различаются между контекстами
  • Interesting Posts

    GLKit сочетает две текстуры

    поведение приложения iOS после установки новой версии из магазина приложений

    AutoLayout не закрепляет subview для наблюдения

    удаление клавиатуры с экрана без вызова resignFirstResponder

    Как изменить имя класса UIViewController в UIStoryboard во время выполнения

    Как проверить, существует ли объект в определенном индексе NSMutableArray?

    NSNumberFormatter numberFromString добавляет небольшую долю при преобразовании определенных чисел

    Как скрыть и отобразить контроллер главного представления в контроллере SplitView

    Открыть и закрыть url в сафари, используя программу ojective-c

    Как обновить фреймворк в приложении iOS?

    Скрыть красную строку состояния записи В приложении iOS, когда нет записи

    Цвет подсветки UINavigationController

    Возвращает многие транзакции в iOS In-App-Purchases подтверждение чеков

    Как использовать cocoapods с детской площадкой?

    Проблемы с созданием UIImage из CIImage в iOS5

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.