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

작업이 최근 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

누구든지 두 라이브러리의 좋은 비교를 보거나 하나에서 다른 라이브러리로 전환하는 문서화 된 경험을 본 적이 있습니까?



답변

나는 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를 고수 할 이유가 없다고 정말 믿습니다.


답변

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

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

  • 아무것도

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


답변

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

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


답변

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


답변

지금까지는 동기 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으로 시간 제한을 설정하는 방법


답변

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


답변

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