Які основні функції ASIHTTPRequest відсутні у AFNetworking?


93

Оскільки нещодавно зупинилася робота над 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

Хтось бачив якісь хороші порівняння двох бібліотек або будь-який задокументований досвід переходу від однієї до іншої?


У AFNetworking бракує дуже детальної документації та прикладів, тому я не можу багато про що сказати. Основна причина, по якій я використовую ASIHTTPRequest, тому що він підтримує iOS 3.0 і ASIFallbackToCacheIfLoadFailsCachePolicyдуже хороший. І я думаю, що AFNetworking не має постійної підтримки кешу. Це не для мене.
iwat

Просто зауважте, що ви перший, хто позначає питання afnetworking.
iwat

Є кеш, який чекає, коли його втягнуть у AFNetworking, я додав посилання у своє запитання.
ДжозефH

1
@iwat AFNetworking повністю підтримує NSURLCache. Якщо ви шукаєте дисковий кеш, від душі пропоную вилку SDURLCache Пітера Штейнбергера .
mattt

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.

EDIT: Я думаю, що настав час оновити цю відповідь, оскільки все змінилося трохи після цієї публікації.

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

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

Я також люблю блоки успіху та невдачі. ASI має лише блок завершення (який фактично є блоком завершення NSOperation). Вам довелося перевірити, чи не відбулася помилка при завершенні, і діяти відповідно. Для складних веб-сервісів ви можете загубитися у всіх "ifs" та "elses"; У AFNetworking справи набагато простіші та інтуїтивніші.

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


1
+1 дуже проникливий. Можливо, варто розмістити свої збої як питання про stackoverflow? Мені буде цікаво детальніше.
ДжозефH

Дякую. Коли у мене будуть конкретні дані про збої, я це зроблю.
csotiriou

3
Чи все ще залишається питання стабільності?
Йохан Карлссон

1
За попередніми даними на основі тестів, які я бачив кілька днів тому, немає. Це не. Однак, навіть з останньою версією рамки, я маю приклад, який іноді виходить з ладу в циклі запуску AFURLConnection, коли достатньо напруженого за допомогою ряду дій за певних умов (виділити / скасувати негайно / deallocate / перерозподілити / почати). Це повинно мати щось спільне з блоками завершення NSOperation та NSRunLoop. Я перевірив реалізацію AFNetworking і не міг знайти причину в цьому.
csotiriou

У ASI є блок відмов.
Кекоа

17

Щойно закінчую проект, де я використовую AFNetworking замість ASI. Використовували ASI у попередніх проектах; це було чудовою допомогою в минулому.

Ось що відсутнє в AFNetworking (станом на сьогодні), про яке слід знати:

  • Нічого

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


9
Як @iwat згадував у коментарях цього питання, в AFNetworking відсутній надійний кешування. Це цікаво і стосується питання, тому "нічого" - це неправильна відповідь. Крім цього, я повністю згоден з вашими настроями, тхо.
Кенні Вінкер

1
@KennyWinker Будь ласка, дивіться мою відповідь у цій темі коментарів. Я радий сказати, що AFNetworking не створюється в кеш-пам’яті. Швидше, можна безкоштовно поміняти своє улюблене NSURLCacheрішення.
Маттт

1
Ніщо не стосується - як я можу використовувати проксі для запитів?
Олексій Воловий

@AlexVolovoy вам, мабуть, найкраще задати це питання як нове запитання
JosephH

Я б не сказав "нічого". Будь ласка, дивіться мою відповідь нижче.
borisdiakur

4

AFNetworking не підтримує clientCertificateIdentity та clientCertificate для аутентифікації клієнта TLS.

Це можна зробити за допомогою - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeметоду в підкласі AFURLConnectionOperation, але це не так просто.


5
Тепер ви можете робити setAuthenticationChallengeBlock:на 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


Ваша думка про тайм-аути хороша, дякую за обмін! Я не розумію, як це стосується синхронного внесення запитів, чи можете ви розширити це?
Йосиф H

@JosephH Ви праві. Звичайно, іноді також потрібно встановити тайм-аут при виконанні асинхронних запитів. Я оновив свою відповідь:]
borisdiakur

Apple виправила проблему, коли timeoutInterval не може бути менше 240 секунд, однак це все ще проблема, оскільки навіть якщо встановити timeoutInterval, запит його якось не поважає.
Джаспер

2

AFNetwork не має можливості завантажувати великі файли. Він передбачає, що вміст файлу знаходиться в оперативній пам'яті. ASI був досить розумним, щоб просто передавати вміст файлів з диска.


0

У ASIHTTP мені сподобалось, що я можу приєднати словник довідника користувача до індивідуальних запитів. Наскільки я бачу, в цьому немає прямої підтримки AFHTTPRequestOperation. Хтось ще придумав елегантне рішення? Крім тривіального підкласу звичайно.


2
Не задавайте питань у відповідях, ваші шанси отримати відповідь дуже низькі. Використовуйте замість цього коментар або нове запитання;)
Michal

-8

AFNetworking працює з "блоками", що для мене більш природно, ніж робота з делегатами, як це робить ASIHTTPRequest.

Робота з блоками - це як робота з функцією Anonymous Function в JavaScript.


Щоправда, але на мій погляд, це не основний підхід для розробки за допомогою ASIHTTPRequest
torhector2

7
Це лише тому, що блоки з'явилися після написання ASIHTTP, я завжди використовую блоки разом з ASI, ніколи не делегатом.
гіперкрипт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.