2014-06-25 3 views
1

필자는 필자가 필요로했던 기능들 사이의 유사성을보기 시작한 여러 제공 업체를 다루기 위해 다른 클래스를 개발하기 시작하면서 다른 데이터 공급자에 연결할 응용 프로그램을 만들고 있습니다. 그래서 NSObject에서 상속받은 기본 클래스를 만들고 모든 클라이언트에 분명히 나타나는 클래스의 일부 속성과 메서드를 노출하기로 결정했습니다. 상속, AFNetworking, 우수 사례?

기본 클래스

@interface AhmBaseDataLoader : NSObject { 
    NSMutableArray *elementsArray; 
} 

- (void)loadElements:(NSString *)searchValue; 
@property (nonatomic, strong) NSArray *Elements; 

내가이 클래스를 상속 약 4 수업을, 그들 모두는 지금까지 내가 기본적인 NSURLSession 작업을 사용하고

이제
loadElements:(NSString *)searchValue { 
    //I dO some data work here using NSURL and basic classes 
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
} 

에 있습니다 데이터를로드하는 하위 클래스 지금까지 괜찮 았어. 이 모든 것은 백그라운드 스레드에서 발생합니다. 로드하는 HTTP 프로세스가 때로는 길어질 수 있으며 때때로 해당 프로세스를 취소 할 수 있어야합니다.

제 질문은 이러한 종류의 설정으로 afnetworking을 포함시키는 것이 유리한가요? 나는 그 매우 인기 있고 매우 빠르다는 것을 알고 있지만 혼란 스럽다. 만약 내가 그것을 사용했다면 나의 baseloader가 AFHTTPSessionManager으로부터 상속 받거나 하나의 속성으로 만들겠습니까? 내 시나리오에서 어떤 것이 좋을까요?

+0

예, 'AFHTTPSessionManager'에서 자체 클래스를 상속하는 것은 매우 일반적인 방법입니다. 당신은 상속 된 클래스에서'requestSerializer'와'responseSerializer'를 커스터마이징 할 수 있습니다. 심지어 당신 자신의 완료 핸들러로 자신의 모든 요청을 정의 할 수도 있습니다. – holex

답변

0

AFNetworking은 네트워킹에 매우 적합한 라이브러리입니다. 기본 스터디보다 더 진보 된 것이 필요하고 스스로 직접 구현하지 않으려한다면 좋은 (최상의?) 선택입니다. AF 2.0은 OSX 및 iOS의 이전 버전과 호환되지 않으므로 사용하는 AF 버전에주의하십시오.

문제에 관하여. 서브 클래 싱의 팬이 아닙니다. 서브 클래 싱하려는 클래스가 있습니다 (예 : UIView, UIViewController 등). 그러나 더 "완전한"클래스의 경우, 클래스를 사용하는 것이 더 일반적입니다. 비헤이비어를 사용자 지정해야하는 경우 대개 대리자 메서드를 제공합니다. 내가 당신이라면 나는 유형 AFHTTPSessionManager의 속성 모두 (이 AF 2.0을 사용하는 경우) 당신이

@property (nonatomic, strong) AFHTTPSessionManager *httpSessionManager; 

객체와 loadElementes: 단순히 그것을 사용을 추가합니다. AppDelegate 또는 개체를 만들면 관리자를 만들고 모든 개체로 설정합니다.

AFHTTPSessionManager *httpSessionManager = ... //; 
AhmBaseDataLoader *myFirstLoader = [[AhmBaseDataLoader alloc] init]; 
myFirstLoader. httpSessionManager = httpSessionManager; 

편집 같은 것을 : 첫 번째 의견에 대해서는 : 당신은 (내가하는 것처럼) 호환성을 위해 AF의 1.X를 사용하는 경우, 대신 AFHTTPSessionManager

EDIT2의 AFHTTPClient를 사용해야합니다. 상위 클래스는 AFHTTPSessionManager이고 모든 하위 클래스는이 하위 클래스에 액세스 할 수 있습니다. 그리고 나는 그들이 loadElements: 방법 (또는 실제로 다른 방법) 중에 그것을 사용한다고 가정합니다. 슈퍼 클래스에는 당연히 init 메소드가있을 수 있습니다. 모든 하위 클래스에 대해 하나의 세션 관리자 만있을 수 있다고 생각합니다 (잘못된 경우 수정하십시오. 요청을 직렬화 할 필요가 없도록 대기열을 사용하여 데이터를로드합니다). 그래서 저는 여러분이 하위 클래스 (예 : AppDelegate)를 생성하는 클래스에서 세션 관리자를 만들고 모든 객체에 세션을 설정했다고 제안했습니다. 예 :

//AppDelegate.m 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    ... 
    AFHTTPSessionManager *httpSessionManager = ... //; create the session and configure it 

    AhmBaseDataLoader *myFirstLoader = [[AhmDerived1DataLoader alloc] init]; 
    myFirstLoader. httpSessionManager = httpSessionManager; 
    AhmBaseDataLoader *mySecondLoader = [[AhmDerived2DataLoader alloc] init]; 
    mySecondLoader. httpSessionManager = httpSessionManager; 
    AhmBaseDataLoader *myThirdLoader = [[AhmDerived3DataLoader alloc] init]; 
    myThirdLoader. httpSessionManager = httpSessionManager; 
    AhmBaseDataLoader *myFourthLoader = [[AhmDerived4DataLoader alloc] init]; 
    myFourthLoader. httpSessionManager = httpSessionManager; 


} 
+0

AF 2.0 및 iOS 7.1을 사용하고 있습니다. 응답에 따라 이제는 AFHTTPSessionManager를 수퍼 클래스에 추가 할 수 있으며 모든 상속하는 클래스에 액세스 할 수 있습니다. 그러나 초기화는 하위 클래스에서 결코 발생하지 않고 수퍼 클래스에서 발생합니다. 그게 맞는 것 같니? – Eddie

+0

@Eddie 내 편집보기 – Francesco

+0

AFNetworking 2는 iOS 6 및 OS X 10.8을 지원하므로 iOS 5/OS X 10.7을 지원하는 경우에만 AFNetworking 1을 사용해야합니다. –