Какие основные функции 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.