2011-09-23 235 views
93

隨着work having recently stopped on ASIHTTPRequest,它似乎注意力轉移到AFNetworkingAFNetworking主要的ASIHTTPRequest功能是什麼?

不過,我還沒有發現的兩個庫的功能比較不錯,所以我不知道是什麼,如果/當我切換我可能會失去。

到目前爲止,我發現

主要區別在於:

  1. AFNetworking具有小得多的代碼大小(這是好的)
  2. AFNetworking正在迅速提高(所以它可能尚未成熟,可能沒有一個穩定的API尚未)
  3. 似乎都具有緩存,雖然我已經看到提示,由於AFNetworking使用NSURLConnection it won't cache objects over 50K
  4. ASIHTTPRequest具有手動&自動(PAC很好的支持),HTTP代理?;我找不到
  5. AFNetworking需要iOS 4+上有什麼級別的支持AFNetworking爲代理的任何信息,而ASIHTTPRequest工程右後衛的iOS 2(不是真的適合我的問題,但它是對某些人的問題)
  6. AFNetworking沒有(還)有一個內置的持久性高速緩存,但有其中有一個未決的拉動請求持久性高速緩存:https://github.com/gowalla/AFNetworking/pull/25

有沒有人看到這兩個庫或任何記錄經歷的任何良好的比較從一個切換到另一個?

+0

AFNetworking缺乏非常詳細的文檔和示例,所以我不能多說這些。我使用ASIHTTPRequest的主要原因是因爲它支持iOS 3.0和'ASIFallbackToCacheIfLoadFailsCachePolicy'非常好。而且,我認爲AFNetworking沒有持久的緩存支持。這對我來說是不行的。 – iwat

+0

只需注意您是第一個用'afnetworking'標記問題的人。 – iwat

+0

有一個等待被拉入AFNetworking的緩存,我在我的問題中添加了一個鏈接。 – JosephH

回答

59

我喜歡ASIHTTPRequest,我很難過看到它。然而,ASI的開發者是正確的,ASIHTTPRequest已經變得如此龐大和臃腫,以至於他無法花時間將其與iOS和其他框架的最新特性相提並論。我繼續前進,現在使用AFNetworking。

也就是說,我必須說AFNetworking比ASIHTTP更不穩定,而且對於我使用它的東西,它需要改進。

我在屏幕上顯示我的結果之前,經常需要向100個HTTP源發出HTTP請求,並且我已將AFHTTPNetworkOperation放入操作隊列中。在下載所有結果之前,我希望能夠取消操作隊列中的所有操作,然後關閉包含結果的視圖控制器。

這並不總是奏效。

隨着AFNetworking在隨機時間發生崩潰,而ASIHTTPRequest,這項操作完美無缺。我希望我可以說AFNetworking的哪個特定部分崩潰,因爲它在不同的點上一直崩潰(但是,大多數時候調試器指向創建NSURLConnection對象的NSRunLoop)。因此,AFNetworking需要成熟才能像ASIHTTPRequest一樣被認爲是完整的。

此外,ASIHTTPRequests支持客戶端認證,AFNetworking目前缺乏。實現它的唯一方法是繼承AFHTTPRequestOperation並覆蓋NSURLConnection的身份驗證方法。但是,如果您開始涉足NSURLConnection,您會注意到將NSURLConnection放入NSOperation包裝器並寫入完成塊並不像聽起來那麼困難,您會開始思考是什麼讓您無法轉儲第三方庫。

ASI使用了一種完全不同的方法,因爲它使用CFNetworking(基於C的更低級別的基礎框架)來完成下載和文件上傳,完全跳過NSURLConnection以及觸摸我們大多數人的概念OS X和iOS開發人員也是如此害怕。正因爲如此,你可以更好地上傳和下載文件,甚至是網頁緩存。

我更喜歡哪一種?這很難說。如果AFNetworking足夠成熟,我會比ASI更喜歡它。在此之前,我不禁讚賞ASI,以及它成爲OS X和iOS所有時間最常用的框架之一。

編輯: 我覺得是時候更新這個答案,因爲事情已經這篇文章後改變了一點。

這篇文章是前段時間寫的,AFNetworking已經夠成熟了。 1個月前AF發佈了POST操作的一個小更新,這是我對框架的最後一次投訴(小行結束錯誤是因爲AF上傳失敗,但在ASI中完成正常)。身份驗證不是AF網絡的問題,對於複雜的身份驗證方法,您可以對操作進行子分類並創建自己的呼叫,AFHTTPClient使基本身份驗證成爲小菜一碟。通過繼承AFHTTPClient,您可以在很短的時間內創建一個完整的服務使用者。

更不用說AFNetworking提供的絕對必要的UIImage補充。通過塊和自定義完成塊以及一些聰明的算法,您可以非常容易地實現異步映像下載和單元填充的表格視圖,而在ASI中,您必須針對帶寬限制設置操作隊列,並介意取消並恢復操作隊列表格視圖可見性以及類似的東西。這類行動的開發時間減半。

我也喜歡成功和失敗的塊。 ASI只有一個完成塊(實際上是NSOperation的完成塊)。您必須檢查完成時是否出現錯誤並採取相應措施。對於複雜的Web服務,您可能會迷失在所有「ifs」和「elses」中;在AFNetworking中,事情更加簡單直觀。

ASI當時非常棒,但通過自動對焦,您可以更好地改變處理Web服務的方式,並且更輕鬆地製作可擴展的應用程序。我真的相信沒有任何理由繼續堅持使用ASI,除非你想要瞄準iOS 3和更低版本。

+1

+1非常有益。也許這是值得張貼您的崩潰作爲一個問題在stackoverflow?我很想看到更多的細節。 – JosephH

+0

謝謝。當我有關於崩潰的具體數據時,我會這樣做。 – csotiriou

+3

穩定性問題仍然是一個問題? –

-9

AFNetworking作品以「塊」,這是更自然的對我來說比像ASIHTTPRequest做代表的工作。

使用塊就像在javascript中使用匿名函數一樣。

+9

ASIHTTPRequest也接受塊 – hypercrypt

+0

是真的,但在我看來,它不是用ASIHTTPRequest開發的主要方法 – torhector2

+7

這只是因爲在寫入ASIHTTP之後塊出現了,我總是使用ASI塊而不是委託。 – hypercrypt

17

剛剛完成一個項目,我正在使用AFNetworking而不是ASI。在以前的項目中使用過ASI;這在過去很有幫助。

這裏的AFNetworking缺失(今天的),你應該知道什麼:

  • 沒有

ASI is going away。現在使用AF。它很小,運作良好,並且將繼續得到支持。它也被組織得更加邏輯,特別是API客戶端。它有許多很棒的類,用於經常使用的特殊情況,例如在表視圖中異步加載圖像。

+9

由於@iwat在問題的逗號中提到,AFNetworking缺少健壯的緩存。這個問題很有意思,所以「無」是錯誤的答案。除此之外,我完全同意你的觀點,壽。 –

+1

@KennyWinker請在該評論主題中看到我的回覆。我很高興地說,AFNetworking不會通過設計構建緩存。相反,可以自由交換他們最喜歡的基於NSURLCache的解決方案。 – mattt

+1

沒有任何部分 - 我如何在請求中使用代理? –

2

我一直在使用ASI *一段時間了,我絕對喜歡ASI的fileupload方法,儘管我很興奮能跳到AFNetworking,但與AfIworking相比,AfNetworking中的fileupload支持並不像ASI *那樣容易使用。

4

AFNetworking不支持clientCertificateIdentity和clientCertificates爲TLS客戶端身份驗證。

我們可以做到這一點,在AFURLConnectionOperation的子類的- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge方法,但它不是那麼容易。

+5

你現在可以在'AFURLConnectionOperation'及其子類上執行'setAuthenticationChallengeBlock:',並傳遞邏輯來處理您需要的任何身份驗證挑戰,無需子類。 – mattt

2

直到現在我無法弄清楚如何做一個同步POST請求時設置的超時與AFNetworking。 UPDATE:我終於想出:https://stackoverflow.com/a/8774125/601466
立即切換到AFNetworking:]

==================

Apple overrides the timeout for a POST, setting it to 240 seconds(如果它被設置的更短,然後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。

也見這裏:How to set a timeout with AFNetworking

+0

你有關超時的觀點很好,謝謝分享!我不明白這與如何同步請求有關,你可以擴展嗎? – JosephH

+0

@JosephH你是對的。當然,有時您在執行異步請求時也需要設置超時時間。我已經更新了我的答案:] – borisdiakur

+0

@JosephH再次用代碼示例更新我的答案。 – borisdiakur

2

AFNetwork缺乏上傳大文件的能力。它假定文件內容在RAM中。 ASI足夠聰明,可以簡單地從磁盤傳輸文件內容。

0

在ASIHTTP中,我喜歡我可以將userinfo字典附加到單個請求中。據我所知,AFHTTPRequestOperation沒有直接的支持。有沒有人提出了一個優雅的解決方法呢?當然除了微不足道的子類。

+2

不要在答案中提問,你獲得反應的機會非常低。改用評論或新問題;) – Michal