#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. Иногда это может быть проблема на стороне сервера, вот почему я спрашиваю.