2010-07-02 6 views
0

나는 선택기 (또는 심지어 다른 패러다임)를 사용해야한다고 생각하지만 TFM을 R'ing 한 후에도 내가해야할 일을 알아낼 수 없다. 그것은 모든콜백에 셀렉터 사용?

내가 내 주요 모델 객체가 대리자에서 콜백에 관련이 :

@implementation Model 
    @synthesize myConnection; // which is an NSURLConnection 
    ... 
    -(void)someMethod{ 
    MyConnectionDelegate *mcd = [[MyConnectionDelegate alloc]initWithCallingObject:self]; 
    myConnection = [[NSURLConnection alloc] initWithRequest:requestForToken delegate:mcd]; 
... 
} 
-(void)didGetCalledBack:(NSArray *)resultArray{ 
    NSLog(@"got the callback"); 
} 

및 다음 내 대리자 :

@implementation MyConnectionDelegate 
@synthesize callingObject; // which is of type id 
@synthesize resultArray; // NSArray 
-(id)initWithCallingObject:(id)caller{ 
    ...//std [self init] block 
    self.callingObject = caller; 
    return self; 
... 
} 


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
... 
} 
//and all the other NSURLConnection delegate methods 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    ... 
    // finish building array of results into self.resultArray 
    [self.callingObject didGetCalledBack:self.resultArray]; 
} 

그래서는 ... 1) 나는 내가해야한다고 생각 호출자 (위임자)가 구현해야하는 사실을 하드 코딩하지 않고 셀렉터 또는 다른 것을 사용하고 있습니까? didGetCalledBack : 맞습니까? 그렇다면 어떻게? (이유는 무엇보다, 청결 함 이외)

2) 아니면 위임자에게 잘못된 NSURLConnection 대리인의 콜백을 사용하려고 시도하는 중 내 전체 구현이 잘못 되었습니까?

나는 애플 샘플 코드 등을 살펴 봤지만 아무 것도 본 적이 없다. delegate:self 이외는 아무것도 없다. 어쩌면 나는 위임을해야한다 : 역시 NSURLConnection에 대한 자기,하지만 많은 연결을하고 있는데 내가 위임 할 경우 : 자기 내 대의원 방법 (예 : didReceiveData :)은 if (connection ==connection1){ 유형 코드의 큰 엉망이된다.

덕분에, 리차드

+0

다른 곳에서 델리게이트를 구현하는 것은 불필요하게 관련 코드를 다른 클래스에 퍼뜨려 유지 보수가 어렵고 이해하기 어렵게 만든다고 생각합니다. 많은 대리인이있는 경우 모델이 지나치게 많습니다 (즉, 다른 곳에 속한 것 * 완전 *). – Eiko

+0

근본적으로 동의하지 않지만 다른 곳에서 델리게이트를 사용하지 않으면 5-6 REST를 호출 할 때마다 리턴 XML이 6 개의 NSXMLParser 델리게이트 메소드와 5 ~ 6 NSURLConnection 델리게이트 메소드의 큰 if/elseif 문으로 끝납니다 . 그게 내가 정리하려고하는거야. 당신은 "그 밖의 다른 곳"을 염두에두고 뭔가 특별한 것을 가지고 있습니까? – richard

+0

큰 if/elseif 블록으로 끝내야하는 이유는 무엇입니까? 그걸 요약 할 수 없니? 지금 가지고 계시다시피, 그 복잡성을 다른 곳으로 옮기실 수 있습니다. –

답변

2

나는 내가 선택기를 사용해야한다고 생각 , 또는 뭔가를 호출자 (위임자?) - didGetCalledBack 구현해야합니다 하드 코딩 대신 다른 : 오른쪽? 그렇다면 어떻게? (이유, 청결 함 이외의 이유)

당신이하고있는 것에는 아무런 문제가 없습니다. 예를 들어 호출 객체에 대한 프로토콜 선언을 고려하는 것이 좋습니다. 당신에게 컴파일시 호출하는 객체가 필요한 방법 (들)을 구현하는 확인을 줄 것이다

@protocol CallingObject <NSObject> 
    -(void) didGetCallBack: (NSArray*) resultArray; 
@end 

그리고

@interface Model : NSObject <CallingObject> // ... 

@interface MyConnectionDelegate : NSObject 
{ 
    // ... 
} 

-(id) initWithCallingObject: (id<CallingObject>) calller; 

// ... 

@end 

.

+0

아 그래, 그거 좋은 생각이야. 나는 그 컴파일 경고를 없애는 방법을 궁금해했다. (지금 나는 경고가 정말 나쁜 곳에서 일한 이전 언어와 달리 경고가 실제로 나쁘다는 것을 알게되었습니다.)) – richard

1

아마 내가 위임이 있어야합니다 너무 NSURLConnection에 대한 자신을하지만, 나는 많은 연결을 그리고 난 delegate:self 내 대리자 메서드를 (-didReceiveData:를 같은)의 큰 혼란하게 할 경우 if (connection ==connection1){ 유형 코드.

명백한 비교를 사용하지 마십시오. 컨테이너 나 유사한 추상화를 사용하여 다른 연결에 반응하십시오.

예. 다음 있도록하는 컨트롤에 NSURLConnection의에서 매핑되는 사전을 사용, 다른 컨트롤 연결의 결과를 사용 :

if  (connection == connection1) [obj1 doStuff]; 
else if (connection == connection2) [obj2 doStuff]; 
// ... 

하면된다 :

[[connectionClients objectForKey:connection] doStuff];