Какие основные функции ASIHTTPRequest отсутствуют в AFNetworking?

93

Поскольку работа над ASIHTTPRequest недавно прекратилась , похоже, что внимание переключается на AFNetworking .

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

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

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

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

JosephH
источник
AFNetworking не хватает очень подробной документации и примеров, поэтому я не могу сказать много об этом. Основная причина, по которой я использую ASIHTTPRequest, потому что он поддерживает iOS 3.0 и ASIFallbackToCacheIfLoadFailsCachePolicyочень хорош. И я думаю, что AFNetworking не поддерживает постоянный кеш. Мне это не подходит.
iwat
Просто обратите внимание, что вы первый, кто помечает вопрос afnetworking.
iwat
Есть кеш, который ждет загрузки в AFNetworking, я добавил ссылку в свой вопрос.
JosephH
1
@iwat AFNetworking полностью поддерживает NSURLCache. Если вы ищете дисковый кеш, я бы с радостью порекомендовал вилку SDURLCache Питера Штейнбергера .
Мэтт
2
Вы пробовали мою сетевую структуру MKNetworkKit? blog.mugunthkumar.com/products/… Базовая, дайджест-аутентификация и NTLM-аутентификация, автоматическое кэширование, встроенное кэширование изображений, очень простая поддержка загрузки файлов, отличная документация - вот лишь некоторые из плюсов.
Mugunth

Ответы:

59

Мне понравился 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.

РЕДАКТИРОВАТЬ: Я думаю, что пришло время обновить этот ответ, так как после этого сообщения все немного изменилось.

Этот пост был написан некоторое время назад, и AFNetworking достаточно повзрослела. 1-2 месяца назад AF опубликовал небольшое обновление для операций POST, которое было моей последней жалобой на фреймворк (небольшая ошибка окончания строки была причиной того, что загрузка echonest завершилась неудачно с AF, но была завершена с ASI). Аутентификация не является проблемой для AFnetworking, поскольку для сложных методов аутентификации вы можете подклассифицировать операцию и выполнять свои собственные вызовы, а AFHTTPClient упрощает базовую аутентификацию. Создав подкласс AFHTTPClient, вы можете за короткое время создать целого потребителя сервиса.

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

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

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

csotiriou
источник
1
+1 очень проницательно. Возможно, стоит опубликовать ваши сбои в качестве вопроса о stackoverflow? Мне было бы интересно узнать подробности.
JosephH
Спасибо. Когда у меня будут конкретные данные о сбоях, я сделаю это.
csotiriou 05
3
Проблема со стабильностью все еще остается проблемой?
Johan Karlsson
1
По предварительным данным, основанным на тестах, которые я провел несколько дней назад, нет. Это не. Однако даже с последней версией фреймворка у меня есть пример, который иногда дает сбой в цикле выполнения AFURLConnection, когда он достаточно нагружен серией действий при определенных условиях (выделить / отменить немедленно / освободить / перераспределить / запустить). Это должно иметь какое-то отношение к блокам завершения NSOperation и NSRunLoop. Я проверил реализацию AFNetworking и не смог найти в этом причины.
csotiriou
У ASI есть блокировка отказа.
Kekoa
17

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

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

  • Ничего

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

Джефф
источник
9
Как упоминал @iwat в комментариях к вопросу, в AFNetworking отсутствует надежное кеширование. Это интересно и имеет отношение к вопросу, поэтому «ничего» - неправильный ответ. В остальном я полностью согласен с вашим мнением.
Кенни Винкер
1
@KennyWinker Пожалуйста, посмотрите мой ответ в этой ветке комментариев. Я рад сообщить, что AFNetworking не встраивает кеш по своей конструкции. Скорее, каждый может свободно поменять свое любимое NSURLCacheрешение.
Мэтт
1
по части Nothing - как я могу использовать прокси в запросах?
Alex Volovoy
@AlexVolovoy, тебе, наверное, лучше задать это как новый вопрос
JosephH
Я бы не сказал «ничего». Пожалуйста, посмотрите мой ответ ниже.
borisdiakur 03
4

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

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

Матье Хаушер
источник
5
Теперь вы можете выполнить setAuthenticationChallengeBlock:on AFURLConnectionOperationи его подкласс, а также передать логику для обработки любых проблем аутентификации по мере необходимости, без необходимости создавать подкласс.
mattt
2

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

Тео Чунг Пинг
источник
2

До сих пор я не мог понять, как установить тайм-аут с 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

борисдиакур
источник
Ваше мнение о тайм-аутах хорошее, спасибо, что поделились! Я не понимаю, как это связано с синхронизацией запросов, не могли бы вы расширить это?
JosephH
@JosephH Вы правы. Конечно, иногда вам также необходимо установить тайм-аут при выполнении асинхронных запросов. Я обновил свой ответ:]
borisdiakur 03
Apple исправила проблему, из-за которой timeoutInterval не мог быть меньше 240 секунд, однако это все еще проблема, так как даже если вы установите timeoutInterval, запрос каким-то образом его не соблюдает.
Джаспер
2

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

Декабрь
источник
0

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

Лвсти
источник
2
Не задавайте вопросов в ответах, ваши шансы получить ответ очень низкие. Вместо этого используйте либо комментарий, либо новый вопрос;)
Michal
-8

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

Работа с блоками похожа на работу с анонимной функцией в javascript.

torhector2
источник
Верно, но, на мой взгляд, это не основной подход к разработке с помощью ASIHTTPRequest
torhector2
7
Это только потому, что блоки появились после того, как был написан ASIHTTP, я всегда использую блоки с ASI, а не делегат.
Hypercrypt