AFNetworking hangi ana ASIHTTPRequest özellikleri eksik?


93

ASIHTTPRequest üzerinde son zamanlarda durmuş olan çalışma ile , dikkatler AFNetworking'e kayıyor gibi görünüyor .

Ancak, iki kitaplığın özelliklerinin iyi bir karşılaştırmasını henüz bulamadım, bu yüzden geçiş yaparsam / değiştirdiğimde ne kaybedebileceğimi bilmiyorum.

Şimdiye kadar gördüğüm önemli farklılıklar:

  1. AFNetworking çok daha küçük bir kod boyutuna sahiptir (bu iyidir)
  2. AFNetworking hızla geliştirilmektedir (bu nedenle henüz olgunlaşmamış olabilir, henüz kararlı bir API'ye sahip olmayabilir?)
  3. Her ikisinde de önbelleğe alma var gibi görünüyor, ancak AFNetworking NSURLConnection kullandığından 50K üzerindeki nesneleri önbelleğe almayacağına dair ipuçları gördüm.
  4. ASIHTTPRequest, manuel ve otomatik (PAC) http proxy'leri için çok iyi bir desteğe sahiptir; AFNetworking'in proxy'ler için ne düzeyde destek sağladığı hakkında herhangi bir bilgi bulamıyorum
  5. AFNetworking iOS 4+ gerektirir, oysa ASIHTTPRequest iOS 2'ye geri dönüyor (benim için gerçekten bir sorun değil, ancak bazı insanlar için bir sorun)
  6. AFNetworking (henüz) yerleşik bir kalıcı önbelleğe sahip değil, ancak bekleyen bir çekme isteği olan kalıcı bir önbellek var: https://github.com/gowalla/AFNetworking/pull/25

İki kitaplık arasında iyi bir karşılaştırma veya birinden diğerine geçiş konusunda belgelenmiş herhangi bir deneyim gören oldu mu?


AFNetworking çok detaylı dokümantasyon ve örneklerden yoksundur, bu yüzden bu konuda çok şey söyleyemem. ASIHTTPRequest'i kullanmamın ana nedeni iOS 3.0'ı destekliyor ve ASIFallbackToCacheIfLoadFailsCachePolicyçok iyi. Ve bence AFNetworking'in kalıcı bir önbellek desteği yok. Bu benim için olmaz.
iwat

Sadece soruyu ilk etiketleyen kişi olduğunuzu fark edin afnetworking.
iwat

AFNetworking'e çekilmeyi bekleyen bir önbellek var, soruma bir bağlantı ekledim.
JosephH

1
@iwat AFNetworking tam olarak destekler NSURLCache. Disk önbelleği arıyorsanız, Peter Steinberger'in SDURLCache çatalını yürekten öneririm .
mattt

2
Ağ çerçevemi MKNetworkKit'i denediniz mi? blog.mugunthkumar.com/products/… Temel, Özet ve NTLM Kimlik Doğrulaması, otomatik önbelleğe alma, yerleşik görüntü önbelleğe alma, süper kolay dosya yükleme desteği, mükemmel dokümantasyon artılarından bazılarıdır.
Mugunth

Yanıtlar:


59

ASIHTTPRequest'i çok sevdim ve gittiğini görmek beni üzdü. Ancak ASI'nin geliştiricisi haklıydı, ASIHTTPRequest o kadar büyük ve şişkin hale geldi ki, onu iOS ve diğer çerçevelerin en yeni özellikleriyle eşit seviyeye getirmek için zaman ayıramadı bile. Devam ettim ve şimdi AFNetworking kullanıyorum.

Bununla birlikte, AFNetworking'in ASIHTTP'den çok daha istikrarsız olduğunu söylemeliyim ve onu kullandığım şeyler için iyileştirmeye ihtiyacı var.

Sonuçlarımı ekranda görüntülemeden önce genellikle 100 HTTP kaynağına HTTP istekleri yapmam gerekiyor ve AFHTTPNetworkOperation'ı bir işlem kuyruğuna koydum. Tüm sonuçlar indirilmeden önce, işlem kuyruğundaki tüm işlemleri iptal edebilmek ve ardından sonuçları tutan görünüm denetleyicisini kapatabilmek istiyorum.

Bu her zaman işe yaramaz.

AFNetworking ile rastgele zamanlarda çökmeler alıyorum, ASIHTTPRequest ile bu işlemler kusursuz çalışıyordu. Keşke farklı noktalarda çökmeye devam ettiği için AFNetworking'in hangi belirli bölümünün çöktüğünü söyleyebilseydim (ancak, çoğu zaman hata ayıklayıcı bir NSURLConnection nesnesi oluşturan NSRunLoop'u işaret eder). Bu nedenle, ASIHTTPRequest'in olduğu kadar eksiksiz olarak kabul edilebilmesi için AFNetworking'in olgunlaşması gerekir.

Ayrıca ASIHTTPRequests, AFNetworking'de şu anda eksik olan istemci kimlik doğrulamasını destekler. Bunu uygulamanın tek yolu, AFHTTPRequestOperation'ın alt sınıfını oluşturmak ve NSURLConnection'ın kimlik doğrulama yöntemlerini geçersiz kılmaktır. Bununla birlikte, NSURLConnection ile ilgilenmeye başlarsanız, NSURLConnection'ı bir NSOperation sarmalayıcısının içine koymanın ve tamamlama blokları yazmanın göründüğü kadar zor olmadığını fark edeceksiniz ve sizi 3. parti kitaplıklardan neyin alıkoyduğunu düşünmeye başlayacaksınız.

ASI, indirmeyi ve dosya yüklemeyi mümkün kılmak için CFNetworking'i (C'ye dayalı alt düzey temel çerçeveleri) kullandığından, NSURLConnection'ı tamamen atladığından ve çoğumuz OS X ve iOS geliştiricilerinin çok korktuğu kavramlara dokunduğundan, tamamen farklı bir yaklaşım kullanır. Bu nedenle, daha iyi dosya yükleme ve indirme, hatta web sayfası önbellekleri elde edersiniz.

Hangisini tercih ederim? Söylemesi zor. AFNetworking yeterince olgunlaşırsa, onu ASI'den daha çok seveceğim. O zamana kadar, ASI'ye ve OS X ve iOS için tüm zamanların en çok kullanılan çerçevelerinden biri haline gelmesine yardımcı olamıyorum ama hayranlık duyuyorum.

DÜZENLEME: Bu gönderiden sonra işler biraz değiştiği için bu cevabı güncellemenin zamanı geldiğini düşünüyorum.

Bu gönderi bir süre önce yazıldı ve AFNetworking yeterince olgunlaştı. 1-2 ay önce AF, çerçeveyle ilgili son şikayetim olan POST işlemleri için küçük bir güncelleme yayınladı (yankılanan yüklemelerin AF ile başarısız olmasına karşın ASI ile iyi tamamlanmış olmasının nedeni küçük bir satır sonu hatasıydı). Kimlik doğrulama, AFnetworking ile ilgili bir sorun değildir, çünkü karmaşık kimlik doğrulama yöntemlerinde, işlemi alt sınıflandırabilir ve kendi aramalarınızı yapabilirsiniz ve AFHTTPClient, temel kimlik doğrulamayı çocuk oyuncağı haline getirir. AFHTTPClient'i alt sınıflayarak, kısa sürede tüm bir hizmet tüketicisi yapabilirsiniz.

AFNetworking'in sunduğu kesinlikle gerekli UIImage eklentilerinden bahsetmiyorum bile. Bloklar ve özel tamamlama blokları ve bazı akıllı algoritmalarla, asenkron görüntü indirme ve hücre doldurma ile tablo görünümlerini oldukça kolay bir şekilde yapabilirsiniz, oysa ASI'de bant genişliği daraltma için işlem kuyrukları oluşturmanız ve işlem kuyruğunu buna göre iptal edip devam ettirmeniz gerektiğine dikkat etmeniz gerekir. tablo görünümü görünürlüğü ve bunun gibi şeyler. Bu tür işlemlerin geliştirme süresi yarıya indirildi.

Başarı ve başarısızlık engellerini de seviyorum. ASI'nin yalnızca bir tamamlama bloğu vardır (bu aslında NSOperation'ın tamamlama bloğudur). Tamamladığınızda bir hata olup olmadığını kontrol etmeli ve buna göre hareket etmelisiniz. Karmaşık web hizmetleri için, tüm "ifs" ve "elses" içinde kaybolabilirsiniz; AFNetworking'de işler çok daha basit ve sezgiseldir.

ASI, zamanı için harikaydı, ancak AF ile web hizmetlerini tamamen iyi bir şekilde işleme şeklinizi değiştirebilir ve ölçeklenebilir uygulamaları daha kolay yapabilirsiniz. İOS 3 ve altını hedeflemek istemiyorsanız, artık ASI'ye bağlı kalmak için hiçbir neden olmadığına gerçekten inanıyorum.


1
+1 çok anlayışlı. Belki de çökmelerinizi stackoverflow'da bir soru olarak göndermeye değer mi? Daha fazla ayrıntı görmek isterim.
JosephH

Teşekkürler. Kazalar hakkında somut verilere sahip olduğumda bunu yapacağım.
csotiriou

3
İstikrar sorunu hala bir sorun mu?
Johan Karlsson

1
Birkaç gün önce yaptığım testlere dayanan bir ön veriye göre, hayır. Değil. Bununla birlikte, çerçevenin en son sürümüyle bile, belirli koşullar altında bir dizi eylemle yeterince vurgulandığında bazen AFURLConnection'ın çalışma döngüsünde çöken bir örneğim var (hemen ayırma / iptal etme / ayırma / yeniden tahsis etme / başlatma). NSOperation tamamlama blokları ve NSRunLoop ile bir ilgisi olmalı. AFNetworking'in uygulanmasını kontrol ettim ve bununla ilgili bir neden bulamadım.
csotiriou

ASI'nin bir arıza bloğu var.
Kekoa

17

ASI yerine AFNetworking kullandığım bir projeyi bitiriyorum. ASI'yi önceki projelerde kullanmış; geçmişte çok yardımcı oldu.

İşte bilmeniz gereken (bugün itibariyle) AFNetworking'de eksik olan şey:

  • Hiçbir şey değil

YSZ uzaklaşıyor . Şimdi AF kullanın. Küçük, çalışıyor ve desteklenmeye devam edecek. Ayrıca, özellikle API istemcileri için daha mantıklı bir şekilde düzenlenmiştir. Tablo görünümlerinde görüntülerin asenkron yüklenmesi gibi sık kullanılan özel durumlar için bir dizi harika sınıfa sahiptir.


9
@İwat'ın soruyla ilgili cevaplarda bahsettiği gibi, AFNetworking'de sağlam önbelleğe alma eksik. Bu ilginç ve soruyla alakalı, yani "hiçbir şey" yanlış cevap değil. Bunun dışında, senin düşüncene tamamen katılıyorum, tho.
Kenny Winker

1
@KennyWinker Lütfen bu yorum başlığındaki cevabıma bakın. AFNetworking'in tasarım gereği bir önbellek oluşturmadığını söylemekten mutluluk duyuyorum. Daha ziyade, en sevdikleri NSURLCachetabanlı çözümü değiştirmekte özgürsünüz .
mattt

1
Hiçbir şey bölümünde - isteklerde vekilleri nasıl kullanabilirim?
Alex Volovoy

@AlexVolovoy, bunu yeni bir soru olarak sormanın en iyisi sizsiniz
JosephH

'Hiçbir şey' demezdim. Lütfen aşağıdaki cevabıma bakın.
borisdiakur

4

AFNetworking, TLS istemci kimlik doğrulaması için clientCertificateIdentity ve clientCertificates'i desteklemez.

Bunu - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeAFURLConnectionOperation alt sınıfındaki yöntemle yapabiliriz, ancak bu o kadar kolay değil.


5
Artık yapabilirsiniz setAuthenticationChallengeBlock:üstünde AFURLConnectionOperationve alt sınıf ve istediğiniz kadar alt sınıf gerek kalmadan, herhangi bir kimlik doğrulama zorlukları ele almak mantık geçmektedir.
mattt

2

Bir süredir ASI * kullanıyorum ve ASI'nin dosya yükleme yaklaşımını kesinlikle seviyorum ve AFNetworking'e atlamaktan heyecan duysam da, AfNetworking'de dosya yükleme desteğinin kullanımı ASI * ile karşılaştırıldığında o kadar kolay değil.


2

Şimdiye kadar , senkronize bir POST isteği yaparken AFNetworking ile bir zaman aşımını nasıl ayarlayacağımı çözemedim . GÜNCELLEME: Sonunda anladım: https://stackoverflow.com/a/8774125/601466 Şimdi AFNetworking'e geçiyorum:]

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

Apple, bir POST için zaman aşımını geçersiz kılarak 240 saniyeye ayarlar ( 240 saniyeden daha kısa ayarlanmış olması durumunda) ve siz değiştiremezsiniz. ASIHTTP ile sadece bir zaman aşımı ayarlarsınız ve çalışır.

Eşzamanlı POST isteği içeren bir kod örneği:

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;

Burada bir zaman aşımı belirlemeye çalıştım ama hiçbir şey işe yaramadı. Bu sorun beni AFNetworking'e geçmeme engel oluyor.

Ayrıca buraya bakın: AFNetworking ile bir zaman aşımı nasıl ayarlanır


Zaman aşımlarıyla ilgili fikriniz güzel, paylaştığınız için teşekkürler! Bunun eşzamanlı olarak talepte bulunmakla nasıl bir ilgisi olduğunu anlamıyorum, bunu genişletebilir misin?
JosephH

@JosephH Haklısın. Elbette bazen eşzamansız istekler yaparken de bir zaman aşımı ayarlamanız gerekir.
Cevabımı

Apple, timeoutInterval'in 240 saniyeden daha az olmaması sorununu çözdü, ancak bu yine de bir sorundur, çünkü timeoutInterval'i ayarlasanız bile, istek buna bir şekilde uymuyor.
Jasper

2

AFNetwork, büyük dosyaları yükleme yeteneğinden yoksundur. Dosya içeriğinin RAM'de olduğunu varsayar. ASI, dosya içeriğini diskten yayınlayacak kadar akıllıydı.


0

ASIHTTP'de, bireysel isteklere bir kullanıcı bilgisi sözlüğü ekleyebilmeyi sevdim. Gördüğüm kadarıyla bunun için doğrudan bir destek yok AFHTTPRequestOperation. Henüz kimse zarif bir çözüm bulmuş mu? Elbette önemsiz alt sınıflandırma dışında.


2
Cevaplarda soru sormayın, cevap alma şansınız çok düşük. Bunun yerine yorum veya yeni soru kullanın;)
Michal

-8

AFNetworking, benim için ASIHTTPRequest gibi delegelerle çalışmaktan daha doğal olan "bloklarla" çalışıyor.

Bloklarla çalışmak, javascript'te Anonim İşlev ile çalışmak gibidir.


Doğru, ancak bence ASIHTTPRequest ile geliştirme ana yaklaşım değil
torhector2

7
Bunun nedeni, ASIHTTP yazıldıktan sonra blokların gelmesi nedeniyle, her zaman ASI ile blokları kullanıyorum, asla bir temsilci kullanmam.
hypercrypt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.