Какие основные функции ASIHTTPRequest отсутствуют в AFNetworking?
С работа, которая недавно остановилась на ASIHTTPRequest, похоже, что внимание переключается на AFNetworking.
Однако я еще не нашел хорошего сравнения функций двух библиотек, поэтому я не знаю, что я могу потерять, если/когда я переключаюсь.
Основные различия, которые я обнаружил до сих пор:
- AFNetworking имеет гораздо меньший размер кода (что хорошо)
- AFNetworking быстро совершенствуется (возможно, он еще не созрел, может еще не иметь стабильного API?)
- У обоих, похоже, есть кеширование, хотя я видел подсказки, что, поскольку AFNetworking использует NSURLConnection, он не будет кэшировать объекты более 50K.
- ASIHTTPRequest имеет очень хорошую поддержку для ручных и автоматических (PAC) HTTP-прокси; Я не могу найти никакой информации о том, какой уровень поддержки AFNetworking имеет для прокси.
- Для AFNetworking требуется iOS 4+, тогда как ASIHTTPRequest работает прямо с iOS 2 (для меня это не проблема, но это проблема для некоторых людей).
- AFNetworking еще не имеет встроенный постоянный кеш, но существует постоянный кеш, у которого есть ожидающий запрос на pull: https://github.com/gowalla/AFNetworking/pull/25
Кто-нибудь видел какие-либо хорошие сравнения двух библиотек или какие-либо задокументированные события перехода от одного к другому?
Ответы
Ответ 1
Мне понравился ASIHTTPRequest, и мне было грустно видеть, как это происходит. Однако разработчик ASI был прав, ASIHTTPRequest стал настолько большим и раздутым, что даже он не мог выделить время, чтобы привести его в соответствие с новейшими функциями iOS и других инфраструктур. Я перешел и теперь использую AFNetworking.
Тем не менее, я должен сказать, что AFNetworking намного более нестабилен, чем ASIHTTP, и для того, для чего я его использую, он нуждается в уточнении.
Мне часто приходится делать HTTP-запросы до 100 HTTP-источников, прежде чем отображать результаты на экране, и я поставил AFHTTPNetworkOperation в очередь операций. Прежде чем все результаты будут загружены, я хочу иметь возможность отменить все операции внутри очереди операций, а затем убрать контроллер представления, содержащий результаты.
Это не всегда работает.
В случайных случаях я получаю сбои с AFNetworking, а с ASIHTTPRequest эти операции работают безупречно. Хотелось бы мне сказать, какая конкретная часть AFNetworking рушится, так как она продолжает сбой в разных точках (однако в большинстве случаев отладчик указывает на NSRunLoop, который создает объект NSURLConnection). Таким образом, AFNetworking нужно созреть, чтобы считаться полным, как ASIHTTPRequest.
Кроме того, ASIHTTPRequests поддерживает аутентификацию клиента, которой нет в настоящее время AFNetworking. Единственный способ реализовать это - подкласс AFHTTPRequestOperation и переопределить методы аутентификации NSURLConnection. Однако, если вы начнете участвовать в NSURLConnection, вы заметите, что размещение NSURLConnection внутри оболочки NSOperation и создание блоков завершения не так сложно, как кажется, и вы начнете думать о том, что мешает вам сбросить сторонние библиотеки.
ASI использует совершенно другой подход, поскольку он использует CFNetworking (базовые основы нижнего уровня на основе C), чтобы сделать загрузку и загрузку файлов возможными, полностью пропуская NSURLConnection и затрагивая концепции. Большинство из нас разработчики OS X и iOS слишком боятся к. Из-за этого вы получаете лучшую загрузку и загрузку файлов, даже кеши веб-страниц.
Что я предпочитаю? Трудно сказать. Если AFNetworking достаточно созревает, мне будет больше, чем ASI. До тех пор я не могу не восхищаться ASI и тем, как он стал одной из самых используемых фреймворков всех времен для OS X и iOS.
EDIT:
Я думаю, что настало время обновить этот ответ, поскольку после этого сообщение немного изменилось.
Эта запись была написана некоторое время назад, и AFNetworking созрела достаточно. 1-2 месяца назад AF опубликовала небольшое обновление для POST-операций, которое было моей последней жалобой на структуру (небольшая ошибка окончания строки была причиной того, что echonest uploads не удался с AF, но были полностью закончены с ASI). Аутентификация не является проблемой с AFnetworking, так как для сложных методов проверки подлинности вы можете подклассифицировать операцию и сделать свои собственные вызовы, а AFHTTPClient делает базовую аутентификацию куском торта. Подклассификация AFHTTPClient вы можете сделать всего потребителя услуг за короткое время.
Не говоря уже о абсолютно необходимых дополнениях UIImage, которые предлагает AFNetworking. С блоками и настраиваемыми блоками завершения и некоторым умным алгоритмом вы можете легко просматривать таблицы с асинхронной загрузкой изображений и заполнением ячеек, тогда как в ASI вам приходилось делать очереди операций для регулирования пропускной способности и думать о том, чтобы отменить и возобновить рабочую очередь в соответствии с видимость табличного вида и тому подобное. Время разработки таких операций сократилось вдвое.
Мне также нравятся блоки успеха и отказа. ASI имеет только блок завершения (который фактически является блоком завершения NSOperation). Вы должны были проверить, была ли у вас ошибка при завершении и действовать соответственно. Для сложных веб-сервисов вы можете потеряться во всех "ifs" и "elses"; В AFNetworking все гораздо проще и интуитивно понятно.
ASI был отличным для своего времени, но с AF вы можете изменить способ обработки веб-сервисов полностью в хорошем смысле и сделать масштабируемые приложения более легкими. Я действительно верю, что нет никакой причины придерживаться ASI, если вы не хотите нацелить iOS 3 и ниже.
Ответ 2
Просто закончить проект, в котором я использую AFNetworking вместо ASI. Использовали ASI для предыдущих проектов; это была большая помощь в прошлом.
Здесь отсутствует то, что AFNetworking отсутствует (на сегодняшний день), о котором вы должны знать:
ASI уходит. Теперь используйте AF. Он маленький, он работает, и он будет продолжать поддерживаться. Он также организован более логично, особенно для клиентов API. Он имеет ряд отличных классов для часто используемых случаев, таких как асинхронная загрузка изображений в представлениях таблицы.
Ответ 3
AFNetworking не поддерживает clientCertificateIdentity и clientCertificates для аутентификации клиента TLS.
Мы можем сделать это с помощью метода - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
в подклассе AFURLConnectionOperation, но это не так просто.
Ответ 4
Я уже некоторое время использую ASI *, и мне очень нравится подход к загрузке файлов ASI, и, хотя я очень рад перейти на AFNetworking, поддержка файловой загрузки в AfNetworking не так проста в использовании по сравнению с ASI *.
Ответ 5
До сих пор я не мог понять, как установить тайм-аут с AFNetworking при выполнении синхронного запроса POST. ОБНОВЛЕНИЕ: Я наконец понял: fooobar.com/questions/60886/...
Теперь переключитесь на AFNetworking:]
==================
Apple отменяет тайм-аут для POST, установив его на 240 секунд (в случае, если он был установлен короче 240 секунд), и вы не можете его изменить, С ASIHTTP вы просто установите тайм-аут, и он работает.
Пример кода с синхронным запросом POST:
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"doSomething", @"task",
@"foo", @"bar",
nil];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:requestURL parameters:params];
[httpClient release];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NDLog(@"fail! %@", [error localizedDescription]);
}];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
[queue addOperation:operation];
[queue waitUntilAllOperationsAreFinished]; // Stuck here for at least 240 seconds!
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
if (![[operation responseString] isEqualToString:@""]) {
return [operation responseString];
}
return nil;
Я попытался установить таймаут здесь, но ничего не получилось. Эта проблема не позволяет мне перейти на AFNetworking.
См. также здесь: Как установить тайм-аут с помощью AFNetworking
Ответ 6
В AFNetwork отсутствует возможность загрузки больших файлов. Предполагается, что содержимое файла находится в ОЗУ.
ASI был достаточно умен, чтобы просто передавать содержимое файла с диска.
Ответ 7
В ASIHTTP мне понравилось, что я могу прикрепить словарь userinfo к отдельным запросам. Насколько я вижу, в AFHTTPRequestOperation
нет прямой поддержки для этого. Кто-нибудь придумал элегантное обходное решение? Помимо тривиального подкласса, конечно.
Ответ 8
AFNetworking работает с "блоками", что для меня более естественно, чем работа с такими делегатами, как ASIHTTPRequest.
Работа с блоками это похоже на работу с анонимной функцией в javascript.