Есть ли более быстрый способ извлечения данных в формате JSON, чем dataWithContentsOfURL?

#objective-c #json #rest #optimization #nsdata

#objective-c #json #остальное #оптимизация #nsdata

Вопрос:

Я создаю приложение, для которого требуются данные в формате JSON. Я использую вызов get для RESTful API и использую и NSJSONSerialization для просмотра данных. Чтобы сократить время запуска, я регистрирую время, необходимое для завершения всего. После ввода следующих инструкций журнала вокруг этого кода я заметил, что выполнение этого единственного вызова занимает в среднем ровно 5 секунд. Есть ли способ, который я могу улучшить на этот раз? Я получаю только 100 сообщений через JSON, поэтому я не могу себе представить, что это самый быстрый способ, который он может перемещать. Вот код:

 NSLog(@"Data Retrieval STARTED");
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:getURL]];
NSLog(@"Data Pull ENDED");
 

Когда я просматриваю журнал, первый оператор журнала и 2-й всегда разделены на 5 секунд, так что есть мой тест, не такой точный, как Time Profiler, но я ему доверяю. Советы приветствуются.

Ответ №1:

Вы должны установить с помощью curl (или аналогичного) базовую линию для сравнения времени 5 секунд. До тех пор я бы предположил, что это транзакция server и ничего особенного, связанного с iOS.

В любом случае, независимо от задержки, удаленный запрос слишком длинный, чтобы выполнять его синхронно, пока приложение блокируется. Вместо этого начните с определения того, что забавная / полезная вещь, которую ваш пользовательский интерфейс может сделать во время запроса (возможно, это просто счетчик или, может быть, другие задачи запуска. Будьте внимательны к этому). Затем создайте NSURLRequest из NSURL и передайте это с NSURLConnection помощью:

   (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
 

В блоке завершения проанализируйте ответ и восстановите свой пользовательский интерфейс в состояние «готово».

Ответ №2:

Вместо этого вы можете использовать dataWithContentsOfURL:options:error: . Для параметра option передайте NSDataReadingUncached , это повысит производительность, если ваши данные считываются только один раз, а затем отбрасываются

Второе решение:

Откройте соединение, используя NSUrlConnection before hand, затем, когда вы получаете файл JSON, для первого открытия соединения не требуется дополнительного времени.

Комментарии:

1. Это не заставило его работать быстрее

2. Если вы запрашиваете это откуда-то еще, например, из другой программы, это происходит быстрее?

3. Я имею в виду, что это происходит быстрее, если я делаю меньше вызовов JSON, например, 50 вместо 100

4. Иногда это может быть проблема на стороне сервера, вот почему я спрашиваю.