คุณลักษณะ ASIHTTPRequest ที่สำคัญอะไรบ้างที่ AFNetworking ขาดหายไป


93

ด้วยการทำงานที่มีการหยุดเมื่อเร็ว ๆ นี้ ASIHTTPRequestดูเหมือนว่าความสนใจจะขยับไปAFNetworking

อย่างไรก็ตามฉันยังไม่พบการเปรียบเทียบที่ดีของคุณสมบัติของทั้งสองไลบรารีดังนั้นฉันจึงไม่รู้ว่าฉันจะสูญเสียอะไรถ้า / เมื่อฉันเปลี่ยนไป

ความแตกต่างที่สำคัญที่ฉันได้พบคือ:

  1. AFNetworking มีขนาดโค้ดที่เล็กกว่ามาก (ซึ่งดี)
  2. AFNetworking กำลังได้รับการปรับปรุงอย่างรวดเร็ว (ดังนั้นอาจยังไม่เป็นผู้ใหญ่อาจยังไม่มี API ที่เสถียร?)
  3. ทั้งสองดูเหมือนจะมีแคชแม้ว่าฉันจะเห็นคำใบ้ว่าเนื่องจาก AFNetworking ใช้NSURLConnection จึงไม่แคชวัตถุเกิน 50K
  4. ASIHTTPRequest มีการสนับสนุนที่ดีมากสำหรับพร็อกซี http แบบแมนนวลและอัตโนมัติ (PAC); ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับระดับการสนับสนุน 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 ฉันได้เพิ่มลิงก์ในคำถามของฉันแล้ว
JosephH

1
@iwat AFNetworking สนับสนุนเต็มที่NSURLCache. หากคุณกำลังมองหาข้อมูลจากดิสก์ผมขอแนะนำอย่างเต็มที่ปีเตอร์ Steinberger ของ SDURLCache ส้อม
mattt

2
คุณได้ลองใช้ MKNetworkKit เฟรมเวิร์กเครือข่ายของฉันแล้วหรือยัง blog.mugunthkumar.com/products/… Basic, Digest และ NTLM Authentication, auto-caching, built-in image caching, super easy file upload support, great documentation are some of the pluses.
Mugunth

คำตอบ:


59

ฉันรัก ASIHTTPRequest และฉันก็เสียใจที่เห็นมันผ่านไป อย่างไรก็ตามผู้พัฒนา ASI พูดถูก ASIHTTPRequest มีขนาดใหญ่และป่องมากจนแม้แต่เขาก็ไม่สามารถอุทิศเวลาเพื่อนำมาใช้กับคุณสมบัติใหม่ล่าสุดของ iOS และเฟรมเวิร์กอื่น ๆ ได้ ฉันย้ายไปและตอนนี้ใช้ AFNetworking

ที่กล่าวมาฉันต้องบอกว่า AFNetworking นั้นไม่เสถียรกว่า ASIHTTP มากและสำหรับสิ่งที่ฉันใช้มันจำเป็นต้องมีการปรับแต่ง

ฉันมักจะต้องส่งคำขอ HTTP ไปยังแหล่งที่มา HTTP 100 รายการก่อนที่ฉันจะแสดงผลลัพธ์บนหน้าจอและฉันได้ใส่ 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 ซึ่งเป็นการร้องเรียนครั้งสุดท้ายของฉันเกี่ยวกับเฟรมเวิร์ก (ข้อผิดพลาดในการสิ้นสุดบรรทัดเล็ก ๆ เป็นสาเหตุที่ทำให้การอัปโหลด AF ล้มเหลวอย่างที่สุด แต่เสร็จสมบูรณ์ด้วย ASI) การรับรองความถูกต้องไม่ใช่ปัญหากับ AFnetworking สำหรับวิธีการตรวจสอบสิทธิ์ที่ซับซ้อนคุณสามารถย่อยการดำเนินการและทำการโทรของคุณเองได้และ AFHTTPClient จะทำให้การรับรองความถูกต้องขั้นพื้นฐานกลายเป็นเค้ก ด้วยคลาสย่อยของ AFHTTPClient คุณสามารถสร้างผู้ใช้บริการทั้งหมดได้ในเวลาอันสั้น

ไม่ต้องพูดถึงส่วนเพิ่มเติม UIImage ที่จำเป็นอย่างยิ่งที่ AFNetworking นำเสนอ ด้วยบล็อกและบล็อกการทำให้เสร็จสมบูรณ์แบบกำหนดเองและอัลกอริทึมที่ชาญฉลาดคุณสามารถสร้างมุมมองตารางด้วยการดาวน์โหลดภาพแบบอะซิงโครนัสและการเติมเซลล์ได้อย่างง่ายดายในขณะที่ใน ASI คุณต้องจัดคิวการดำเนินการเพื่อควบคุมปริมาณแบนด์วิดท์และจำตัวเองเพื่อยกเลิกและดำเนินการต่อคิวการดำเนินการต่อตาม การมองเห็นมุมมองตารางและสิ่งต่างๆเช่นนั้น เวลาในการพัฒนาการดำเนินการดังกล่าวลดลงครึ่งหนึ่ง

ฉันยังรักบล็อกความสำเร็จและความล้มเหลว ASI มีเพียงบล็อกที่สมบูรณ์ (ซึ่งจริงๆแล้วเป็นบล็อกที่สมบูรณ์ของ NSOperation) คุณต้องตรวจสอบว่าคุณมีข้อผิดพลาดในการดำเนินการเสร็จสิ้นหรือไม่และดำเนินการตามนั้น สำหรับบริการเว็บที่ซับซ้อนคุณอาจหลงทางใน "ifs" และ "elses" ทั้งหมด ใน AFNetworking สิ่งต่างๆนั้นเรียบง่ายและใช้งานง่ายกว่ามาก

ASI นั้นยอดเยี่ยมในช่วงเวลานั้น แต่ด้วย AF คุณสามารถเปลี่ยนวิธีจัดการบริการบนเว็บได้อย่างสมบูรณ์ในรูปแบบที่ดีและทำให้แอปพลิเคชันที่ปรับขนาดได้ง่ายขึ้น ฉันเชื่อจริงๆว่าไม่มีเหตุผลใดที่จะยึดติดกับ ASI อีกต่อไปเว้นแต่คุณต้องการกำหนดเป้าหมายเป็น iOS 3 และต่ำกว่า


1
+1 ไม่สำคัญมาก บางทีคุณควรโพสต์ข้อขัดข้องของคุณเป็นคำถามใน stackoverflow หรือไม่? ฉันสนใจที่จะดูรายละเอียดเพิ่มเติม
JosephH

ขอบคุณ. เมื่อฉันมีข้อมูลที่ชัดเจนเกี่ยวกับข้อขัดข้องฉันจะดำเนินการดังกล่าว
csotiriou

3
ปัญหาความเสถียรยังคงเป็นปัญหาอยู่หรือไม่?
Johan Karlsson

1
จากข้อมูลเบื้องต้นจากการทดสอบที่ฉันทำเมื่อหลายวันก่อนไม่มี มันไม่ใช่. อย่างไรก็ตามแม้จะมีเวอร์ชันล่าสุดของเฟรมเวิร์กฉันก็มีตัวอย่างที่ขัดข้องในบางครั้งบนลูปการทำงานของ AFURLConnection เมื่อเน้นมากพอกับชุดการดำเนินการภายใต้เงื่อนไขบางประการ (จัดสรร / ยกเลิกทันที / ยกเลิกการจัดสรร / จัดสรรใหม่ / เริ่มต้น) มันต้องมีบางอย่างที่เกี่ยวข้องกับ NSOperation complete blocks และ NSRunLoop แม้ว่า ฉันตรวจสอบการใช้งาน AFNetworking แล้วและไม่พบสาเหตุ
csotiriou

ASI มีบล็อกความล้มเหลว
Kekoa

17

เพิ่งจบโปรเจ็กต์ที่ฉันใช้ AFNetworking แทน ASI ใช้ ASI ในโครงการก่อนหน้านี้ มันเป็นความช่วยเหลือที่ดีในอดีต

นี่คือสิ่งที่ AFNetworking ขาดหายไป (ณ วันนี้) ที่คุณควรทราบ:

  • ไม่มีอะไร

ASI กำลังจะหายไป ใช้ AF เลย มีขนาดเล็กใช้งานได้และจะได้รับการสนับสนุนต่อไป นอกจากนี้ยังจัดอย่างมีเหตุผลมากขึ้นโดยเฉพาะอย่างยิ่งสำหรับไคลเอนต์ API มีคลาสที่ยอดเยี่ยมมากมายสำหรับกรณีพิเศษที่ใช้บ่อยเช่นการโหลดรูปภาพแบบอะซิงโครนัสในมุมมองตาราง


9
ดังที่ @iwat กล่าวไว้ในคอมเมนต์ในคำถาม AFNetworking ไม่มีแคชที่มีประสิทธิภาพ นั่นน่าสนใจและเกี่ยวข้องกับคำถามดังนั้น "nothing" จึงเป็นคำตอบที่ผิด นอกเหนือจากนั้นฉันเห็นด้วยอย่างยิ่งกับความเชื่อมั่นของคุณ tho
Kenny Winker

1
@KennyWinker โปรดดูการตอบกลับของฉันในชุดความคิดเห็นนั้น ฉันยินดีที่จะบอกว่า AFNetworking ไม่ได้สร้างแคชตามการออกแบบ แต่เรามีอิสระในการแลกเปลี่ยนNSURLCacheโซลูชันที่เป็นที่ชื่นชอบ
mattt

1
ในส่วนที่ไม่มีอะไร - ฉันจะใช้พร็อกซีในคำขอได้อย่างไร
Alex Volovoy

@AlexVolovoy คุณน่าจะถามเป็นคำถามใหม่ได้ดีที่สุด
JosephH

ฉันจะไม่พูดว่า 'ไม่มีอะไร' โปรดดูคำตอบของฉันด้านล่าง
borisdiakur

4

AFNetworking ไม่สนับสนุน clientCertificateIdentity และ clientCertificates สำหรับการตรวจสอบไคลเอ็นต์ TLS

เราสามารถทำได้ด้วย- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeวิธีการในคลาสย่อยของ AFURLConnectionOperation แต่มันไม่ง่ายอย่างที่คิด


5
ตอนนี้คุณสามารถทำsetAuthenticationChallengeBlock:ในAFURLConnectionOperationคลาสย่อยและส่งผ่านตรรกะเพื่อจัดการกับความท้าทายในการพิสูจน์ตัวตนตามที่คุณต้องการโดยไม่ต้องมีคลาสย่อย
แมตต์

2

ฉันใช้ ASI * มาระยะหนึ่งแล้วและฉันก็ชอบวิธีการอัปโหลดไฟล์ของ ASI มากและแม้ว่าฉันจะรู้สึกตื่นเต้นที่ได้ข้ามไปที่ AFNetworking แต่การสนับสนุน fileupload ใน AfNetworking นั้นใช้งานไม่ง่ายเมื่อเทียบกับ ASI *


2

จนถึงตอนนี้ฉันยังคิดไม่ออกว่าจะกำหนดระยะหมดเวลาด้วย AFNetworking อย่างไรเมื่อทำคำขอ POST แบบซิงโครนัUPDATE:ในที่สุดฉันก็พบ: 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

Apple แก้ไขปัญหาเกี่ยวกับ timeoutInterval ไม่สามารถน้อยกว่า 240 วินาทีได้อย่างไรก็ตามยังคงเป็นปัญหาอยู่แม้ว่าคุณจะตั้งค่า timeoutInterval ก็ตามคำขอก็ไม่เป็นไปตามนั้น
Jasper

2

AFNetwork ขาดความสามารถในการอัปโหลดไฟล์ขนาดใหญ่ ถือว่าเนื้อหาไฟล์อยู่ใน RAM ASI ฉลาดพอที่จะสตรีมเนื้อหาไฟล์จากดิสก์


0

ใน ASIHTTP ฉันชอบที่จะแนบพจนานุกรม userinfo กับคำขอแต่ละรายการ เท่าที่ฉันเห็นไม่มีการสนับสนุนโดยตรงสำหรับสิ่งนี้ในAFHTTPRequestOperation. มีใครคิดวิธีแก้ปัญหาเบื้องต้นหรือยัง? นอกเหนือจากคลาสย่อยที่ไม่สำคัญแน่นอน


2
อย่าถามคำถามเป็นคำตอบโอกาสที่คุณจะได้รับคำตอบนั้นต่ำมาก ใช้ความคิดเห็นหรือคำถามใหม่แทน;)
คาล

-8

AFNetworking ทำงานกับ "บล็อก" ซึ่งเป็นธรรมชาติสำหรับฉันมากกว่าการทำงานกับผู้รับมอบสิทธิ์อย่าง ASIHTTPRequest ทำ

การทำงานกับบล็อกก็เหมือนกับการทำงานกับ Anonymous Function ใน javascript


จริง แต่ในความคิดของฉันมันไม่ใช่แนวทางหลักในการพัฒนาด้วย ASIHTTPRequest
torhector2

7
นั่นเป็นเพียงเพราะบล็อกเกิดขึ้นหลังจากเขียน ASIHTTP แล้วฉันมักจะใช้บล็อกกับ ASI เสมอไม่เคยเป็นผู้รับมอบสิทธิ์
hypercrypt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.