Какие основные функции ASIHTTPRequest отсутствуют в AFNetworking? - PullRequest
93 голосов
/ 23 сентября 2011

Когда работа недавно была остановлена ​​на ASIHTTPRequest , кажется, что внимание переключается на AFNetworking .

Однако я пока не нашел хорошего сравненияфункции двух библиотек, поэтому я не знаю, что я могу потерять, если / когда я переключусь.

Основные различия, которые я обнаружил до сих пор:

  1. AFNetworkingимеет гораздо меньший размер кода (что хорошо)
  2. Быстро улучшается AFNetworking (так что, возможно, он еще не вступил в силу, может еще не иметь стабильного API?)
  3. Кажется, что оба имеютКэширование, хотя я видел намеки на то, что, поскольку AFNetworking использует NSURLConnection, он не будет кэшировать объекты свыше 50K
  4. ASIHTTPRequest имеет очень хорошую поддержку для ручных и автоматических (PAC) HTTP-прокси;Я не могу найти информацию о том, какой уровень поддержки AFNetworking имеет для прокси
  5. . Для AFNetworking требуется iOS 4+, тогда как ASIHTTPRequest работает обратно на iOS 2 (на самом деле это не проблема для меня, но это проблема длянекоторые люди)
  6. AFNetworking не имеет (пока) встроенного постоянного кэша, но есть постоянный кэш с ожидающим запросом на получение: https://github.com/gowalla/AFNetworking/pull/25

Кто-нибудь виделкакие-нибудь хорошие сравнения двух библиотек или какие-либо задокументированные случаи перехода с одной на другую?

Ответы [ 8 ]

59 голосов
/ 04 декабря 2011

Мне понравился 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 завершилась неудачно с AF, но была завершена нормально с ASI). Аутентификация не является проблемой для AFnetworking, так как для сложных методов аутентификации вы можете разделить операцию на подклассы и сделать свои собственные вызовы, а AFHTTPClient делает простую аутентификацию простой. Используя подклассы AFHTTPClient, вы можете сделать потребителя всего сервиса за короткое время.

Не говоря уже о абсолютно необходимых дополнениях UIImage, которые предлагает AFNetworking. С блоками и настраиваемыми блоками завершения и некоторым умным алгоритмом вы можете довольно легко создавать представления таблиц с асинхронной загрузкой изображений и заполнением ячеек, тогда как в ASI вам приходилось создавать очереди операций для регулирования пропускной способности и не забывать отменять и возобновлять очередь операций в соответствии с видимость таблицы и тому подобное. Время разработки таких операций сократилось вдвое.

Мне также нравятся блоки успеха и неудач. ASI имеет только блок завершения (который фактически является блоком завершения NSOperation). Вы должны были проверить, была ли у вас ошибка при завершении, и действовать соответствующим образом. Для сложных веб-сервисов вы можете потеряться во всех «ifs» и «elses»; В AFNetworking все гораздо проще и понятнее.

ASI отлично подходил для своего времени, но с помощью AF вы можете полностью изменить способ обработки веб-сервисов и упростить создание масштабируемых приложений. Я действительно считаю, что нет никаких оснований больше придерживаться ASI, если только вы не хотите использовать iOS 3 и ниже.

17 голосов
/ 30 сентября 2011

Просто заканчиваю проект, в котором я использую AFNetworking вместо ASI.Использовали ASI в предыдущих проектах;в прошлом это была большая помощь.

Вот что вам не нужно знать AFNetworking (на сегодняшний день):

  • Ничего

ASI уходит .Используйте AF сейчас.Он маленький, работает и будет продолжать поддерживаться.Это также организовано более логично, особенно для клиентов API.Он имеет ряд отличных классов для часто используемых особых случаев, таких как асинхронная загрузка изображений в табличных представлениях.

4 голосов
/ 07 ноября 2011

AFNetworking не поддерживает clientCertificateIdentity и clientCertificates для аутентификации клиента TLS.

Мы можем сделать это с помощью метода - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge в подклассе AFURLConnectionOperation, но это не так просто.

2 голосов
/ 18 апреля 2012

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

2 голосов
/ 03 января 2012

До сих пор Я не мог понять, как установить время ожидания с AFNetworking при выполнении синхронного запроса POST . ОБНОВЛЕНИЕ: Я наконец понял: https://stackoverflow.com/a/8774125/601466
Теперь переключаемся на 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

2 голосов
/ 10 октября 2011

Я уже некоторое время использую ASI *, и мне очень нравится подход ASI к загрузке файлов, и хотя я с нетерпением жду перехода к AFNetworking, поддержка загрузки файлов в AfNetworking не так проста в использовании по сравнению с ASI *.

0 голосов
/ 30 ноября 2012

В ASIHTTP мне понравилось, что я могу прикрепить словарь userinfo к отдельным запросам.Насколько я вижу, в AFHTTPRequestOperation прямой поддержки этого нет.Кто-нибудь еще придумал элегантный обходной путь?Помимо тривиального подкласса, конечно.

0 голосов
/ 27 сентября 2011

AFNetworking работает с «блоками», что для меня более естественно, чем работа с делегатами, как это делает ASIHTTPRequest.

Работа с блоками - это все равно что работать с анонимной функцией в javascript.

...