AFNetworking에 누락 된 주요 ASIHTTPRequest 기능은 무엇입니까?


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으로 가져 오기를 기다리는 캐시가 있습니다. 내 질문에 링크를 추가했습니다.
JosephH 2011 년

1
@iwat AFNetworking은 NSURLCache. 디스크 캐시를 찾고 있다면 Peter Steinberger의 SDURLCache fork를 진심으로 제안 합니다.
mattt

2
내 네트워킹 프레임 워크 MKNetworkKit을 사용해 보셨습니까? blog.mugunthkumar.com/products/… 기본, 다이제스트 및 NTLM 인증, 자동 캐싱, 내장 이미지 캐싱, 매우 쉬운 파일 업로드 지원, 우수한 문서가 장점 중 일부입니다.
Mugunth

답변:


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 ~ 2 개월 전 AF는 프레임 워크에 대한 마지막 불만 인 POST 작업에 대한 작은 업데이트를 게시했습니다 (작은 라인 종료 오류는 AF에서 에코 네스트 업로드가 실패했지만 ASI에서는 정상적으로 완료되는 이유였습니다). 복잡한 인증 방법의 경우 작업을 하위 클래스 화하고 직접 호출 할 수 있으며 AFHTTPClient는 기본 인증을 케이크 조각으로 만들 수 있으므로 인증은 AF 네트워킹에서 문제가되지 않습니다. AFHTTPClient를 서브 클래 싱하면 짧은 시간에 전체 서비스 소비자를 만들 수 있습니다.

AFNetworking이 제공하는 절대적으로 필요한 UIImage 추가는 말할 것도 없습니다. 블록 및 사용자 지정 완료 블록 및 일부 영리한 알고리즘을 사용하면 비동기 이미지 다운로드 및 셀 채우기를 사용하여 테이블보기를 매우 쉽게 만들 수있는 반면, ASI에서는 대역폭 조절을위한 작업 대기열을 만들고 다음에 따라 작업 대기열을 취소하고 다시 시작해야했습니다. 테이블 뷰 가시성 등이 있습니다. 이러한 작업의 개발 시간이 절반으로 단축되었습니다.

나는 또한 성공과 실패 블록을 좋아합니다. ASI에는 완료 블록 (실제로 NSOperation의 완료 블록) 만 있습니다. 완료시 오류가 있는지 확인하고 그에 따라 조치를 취해야했습니다. 복잡한 웹 서비스의 경우 모든 "ifs"및 "elses"에서 길을 잃을 수 있습니다. AFNetworking에서는 상황이 훨씬 더 간단하고 직관적입니다.

ASI는 그 당시에는 훌륭했지만 AF를 사용하면 웹 서비스를 잘 처리하는 방식을 완전히 바꿀 수 있고 확장 가능한 응용 프로그램을 더 쉽게 만들 수 있습니다. iOS 3 이하를 타겟팅하지 않는 한 더 이상 ASI를 고수 할 이유가 없다고 정말 믿습니다.


1
+1 매우 불쾌합니다. 아마도 stackoverflow에 대한 질문으로 크래시를 게시 할 가치가 있습니까? 자세한 내용을보고 싶습니다.
JosephH 2011

감사. 충돌에 대한 구체적인 데이터가 있으면 그렇게 할 것입니다.
csotiriou 2011

3
안정성 문제가 여전히 문제입니까?
Johan Karlsson

1
며칠 전에 실행 한 테스트를 기반으로 한 예비 데이터에서는 그렇지 않습니다. 그렇지 않습니다. 그러나 최신 버전의 프레임 워크를 사용하더라도 특정 조건 (즉시 할당 / 취소 / 할당 해제 / 재 할당 / 시작)에서 일련의 작업으로 충분히 스트레스를 받으면 AFURLConnection의 실행 루프에서 가끔 충돌하는 예제가 있습니다. NSOperation 완료 블록 및 NSRunLoop과 관련이 있어야합니다. AFNetworking 구현을 확인했지만 원인을 찾을 수 없습니다.
csotiriou

ASI에는 장애 블록이 있습니다.
Kekoa

17

ASI 대신 AFNetworking을 사용하는 프로젝트를 마무리하는 중입니다. 이전 프로젝트에서 ASI를 사용했습니다. 과거에는 큰 도움이되었습니다.

다음은 알아야 할 AFNetworking (오늘 현재)이 누락 된 사항입니다.

  • 아무것도

ASI 가 사라집니다 . 지금 AF를 사용하십시오. 작고 작동하며 계속 지원 될 것입니다. 특히 API 클라이언트의 경우 더욱 논리적으로 구성됩니다. 테이블 뷰에서 이미지를 비동기로로드하는 것과 같이 자주 사용되는 특수한 경우를위한 많은 훌륭한 클래스가 있습니다.


9
@iwat가 질문에 대한 명령에서 언급했듯이 AFNetworking에는 강력한 캐싱이 없습니다. 흥미롭고 질문과 관련이 있으므로 "아무것도"가 잘못된 답입니다. 그 외에는 당신의 감정에 전적으로 동의합니다.
Kenny Winker 2011 년

1
@KennyWinker 해당 댓글 스레드에서 내 답장을 참조하십시오. AFNetworking이 설계 상 캐시에 구축되지 않는다는 점을 기쁘게 생각합니다. 오히려 선호하는 NSURLCache기반 솔루션으로 자유롭게 교체 할 수 있습니다.
mattt

1
아무 부분도-요청에서 프록시를 어떻게 사용할 수 있습니까?
Alex Volovoy 2011

당신은 아마있어 @AlexVolovoy 최고 새로운 질문으로 그에게 물어
JosephH

나는 '아무것도'라고 말하지 않을 것입니다. 아래 내 대답을 참조하십시오.
borisdiakur

4

AFNetworking은 TLS 클라이언트 인증을 위해 clientCertificateIdentity 및 clientCertificates를 지원하지 않습니다.

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeAFURLConnectionOperation의 하위 클래스에 있는 메서드로이를 수행 할 수 있지만 쉽지는 않습니다.


5
당신은 지금 할 수있는 setAuthenticationChallengeBlock:AFURLConnectionOperation와 그 서브 클래스, 당신이 필요로하는 서브 클래스로하지 않고, 모든 인증 문제를 처리하기 위해 논리에 전달합니다.
mattt

2

저는 한동안 ASI *를 사용해 왔으며 ASI의 파일 업로드 접근 방식을 절대적으로 좋아합니다. AFNetworking으로 이동하게되어 기쁘지만 AfNetworking의 파일 업로드 지원은 ASI *에 비해 사용하기가 쉽지 않습니다.


2

지금까지는 동기 POST 요청을 수행 할 때 AFNetworking 으로 시간 제한 을 설정하는 방법을 알아낼 수 없었습니다 . 업데이트 : 나는 마침내 알아 냈습니다 : 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 당신이 맞습니다. 물론 때로는 비동기 요청을 수행 할 때 시간 제한을 설정해야합니다. 내 answere를 업데이트 :]
borisdiakur

Apple은 timeoutInterval이 240 초 미만이 될 수없는 문제를 해결했지만 timeoutInterval을 설정하더라도 요청이 어떻게 든이를 준수하지 않기 때문에 여전히 문제입니다.
Jasper

2

AFNetwork에는 대용량 파일을 업로드하는 기능이 없습니다. 파일 내용이 RAM에 있다고 가정합니다. ASI는 디스크에서 파일 콘텐츠를 간단히 스트리밍 할 수있을만큼 똑똑했습니다.


0

ASIHTTP에서 개별 요청에 사용자 정보 사전을 첨부 할 수 있다는 점이 마음에 들었습니다. 내가 보는 한 AFHTTPRequestOperation. 아무도 우아한 해결 방법을 아직 생각해 냈습니까? 물론 사소한 서브 클래 싱을 제외하고.


2
답변에 대한 질문을하지 마십시오. 답변을받을 가능성이 매우 낮습니다. 대신 댓글이나 새 질문을 사용하세요.;)
Michal

-8

AFNetworking은 ASIHTTPRequest와 같은 델리게이트로 작업하는 것보다 저에게 더 자연스러운 "블록"과 함께 작동합니다.

블록으로 작업하는 것은 자바 스크립트에서 익명 함수로 작업하는 것과 같습니다.


사실,하지만 내 의견으로는 ASIHTTPRequest으로 개발하는 주요 방식이 아닌
torhector2

7
ASIHTTP가 작성된 후에 블록이 생성 되었기 때문입니다. 저는 항상 ASI와 함께 블록을 사용하고 델리게이트가 아닙니다.
hypercrypt 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.