Является ли dataWithContentsOfURL плохим при запуске приложения?

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

NSData *data = [NSData dataWithContentsOfURL:url];

Это плохо? Прямо сейчас я настроил метод, который содержит это, для запуска в фоновом потоке с использованием GCD, но я слышал, что, поскольку dataWithContentsOfURL является синхронным, это плохо. Есть мнения по этому поводу?


person Yep    schedule 20.11.2011    source источник
comment
@bryanmac Пожалуйста, используйте тег grand-central-dispatch для вопросов об Apple GCD.   -  person    schedule 21.11.2011


Ответы (2)


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

Вам нужно сделать его асинхронным. Вы можете сделать это, запустив этот метод в фоновом потоке (GCD dispatch_async) или используя асинхронные методы NSUrlConnection.

Вот пример использования GCD для работы в фоновом режиме с последующим обновлением пользовательского интерфейса (после завершения) в основном потоке:

GCD, потоки, программный поток и обновление пользовательского интерфейса

Другой вариант — асинхронный метод NSUrlConnection. См. методы initWithRequest здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

person bryanmac    schedule 20.11.2011
comment
Если запустить его в фоновом потоке с помощью GDC, будет ли это проблемой? - person Yep; 20.11.2011
comment
Я сделал так: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //do something }); - person Yep; 20.11.2011
comment
Должен ли я не использовать глобальный фоновый поток? Должен ли я создать его самостоятельно? - person Yep; 20.11.2011
comment
Это нормально - пока это асинхронно. но все же будьте осторожны, даже если асинхронно - надеюсь, приложение рисует и доступно. Если вы сделаете это асинхронным, но дождетесь, пока это будет сделано, прежде чем показать что-нибудь полезное, восприятие того, что оно зависает при запуске, все равно будет - покажите какой-нибудь пользовательский интерфейс - покажите загрузку... что-то. - person bryanmac; 20.11.2011
comment
разница между глобальной очередью и ее созданием самостоятельно зависит от того, как вы хотите синхронизировать элементы очереди в фоновом режиме. Это очередь, поэтому они обрабатывают 1 за другим 1, но в bg... - person bryanmac; 20.11.2011
comment
Например, если вы хотите, чтобы разные подсистемы вашего приложения были асинхронными и синхронизированными, но работали параллельно с другими подсистемами, которые не используют общие данные, вы можете создать свою собственную. глобально просто... - person bryanmac; 20.11.2011

Вы в безопасности, пока запускаете его в фоновом потоке.
Идея о том, что синхронная загрузка — это плохо, применима только к основному потоку пользовательского интерфейса. Длительная работа в основном потоке пользовательского интерфейса приведет к тому, что ваше приложение перестанет отвечать на запросы. Выполнение этого в фоновом режиме - правильный способ сделать это. Также рассмотрите возможность использования:

+dataWithContentsOfURL:options:error: 

так что вы можете получить сообщение об ошибке, если что-то пойдет не так.

person George    schedule 23.10.2012