Является ли асинхронный вызов API (Parse) просто использованием GCD? iOS

Как следует из названия...

Вызов асинхронного API, как в Parse API для iOS, просто помещает этот вызов в новый поток (используя GCD), чтобы он выполнялся «в фоновом режиме»?

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

Спасибо!


person justColbs    schedule 26.08.2015    source источник


Ответы (4)


tl;dr это зависит от разработчика с некоторыми исключениями

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

Grand Central Dispatch (GCD) — это технология, разработанная Apple Inc. для оптимизации поддержки приложений для систем с многоядерными процессорами и другими симметричными многопроцессорными системами. Это реализация параллелизма задач на основе шаблона пула потоков. Основная идея состоит в том, чтобы перевести управление пулом потоков из рук разработчика в операционную систему. Разработчик внедряет «рабочие пакеты» в пул, не обращая внимания на архитектуру пула. Эта модель повышает простоту, переносимость и производительность.1

Во-вторых, что вы подразумеваете под API? Я полагаю, вы хотели сказать REST API. Другое предположение заключается в том, что вы имеете в виду собственный SDK для сервиса REST API, потому что если вы реализуете его самостоятельно через сетевую библиотеку, то вы несете ответственность за это. Как я вижу из своего более чем 3-летнего опыта, в iOS все вызовы любого метода синхронны по умолчанию, разработчик несет ответственность за помещение их в другую очередь через GCD или NSOperationQueue или что-то еще.

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

Существует лишь несколько исключений SDK, которые помещают весь блок завершения в основную очередь, например. AFNetworking или Parse. Но в этом случае поставщики SDK предоставляют информацию об этом поведении.

person Yurii Kolesnykov    schedule 26.08.2015

Я считаю, что он использует тот же приоритет или очередь операций, из которой был сделан вызов. Например, при выполнении вызова Parse API в основном потоке вы часто будете получать предупреждение о длительных операциях основного потока.

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

person Lytic    schedule 26.08.2015

Не обязательно. Он может находиться в другой очереди операций с другим приоритетом отправки.

person Saleh Albuga    schedule 26.08.2015

Это будет в другом потоке, как видно из открытого исходного кода. Он использует блокировки и теги @synchronize, чтобы убедиться, что все в конечном итоге сойдется для блоков и т. д.

person AlexKoren    schedule 26.08.2015