2010-07-02 55 views
0

我想我應該使用選擇器(甚至是不同的範例),但即使在TF'RM之後,我無法弄清楚我應該做什麼。這一切都與回調從委託使用選擇器進行回調?

我有我的主要模型對象:

@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

我認爲從Model建立連接,但是在其他地方實現委託會不必要地將相關代碼在不同的類中傳播,這使得難以維護並難以理解。 如果你有很多代表,那麼你的模型可能做的太多了,即屬於其他地方的東西*完全*。 – Eiko 2010-07-02 00:15:36

+0

我根本不反對,但如果我不在其他地方使用委託,那麼我的5-6 REST調用每個返回的XML都會以我的6個NSXMLParser委託方法和5-6個NSURLConnection委託方法中的大if/elseif語句結束。這就是我想要清理的東西。你對「完全在別的地方」有什麼特別的想法嗎? – richard 2010-07-02 17:07:03

+0

爲什麼它必須以大if/elseif塊結束?你不能抽象嗎?就像你現在所擁有的那樣,你只是將這種複雜性移到其他地方。 – 2010-07-03 16:21:10

回答

2

我想我應該用選擇,或其他的東西,而不是硬編碼調用者(委託人?)需要實現-didGetCalledBack的事實:對嗎?如果是這樣,怎麼樣? (以及爲什麼,除了清潔)

你在做什麼沒有錯。您可能想要考慮爲調用對象聲明協議,例如

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

然後

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

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

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

// ... 

@end 

這將會給你一些編譯時檢查調用對象實現所需的方法(S)。

+0

啊,是的,這是一個好主意 - 我想知道如何擺脫編譯警告。 (現在我已經認識到警告是非常糟糕的,不像以前的語言,我曾經在那裏警告只是糟糕的;)) – richard 2010-07-02 16:24:36

1

也許我應該代表:太自我爲NSURLConnection,但我在做很多的連接,如果我做我的delegate:self委託方法(如-didReceiveData:)成爲一個大混亂if (connection ==connection1){類型代碼。

然後不要使用顯式比較 - 使用容器或類似的抽象來對不同的連接作出反應。

E.g.使用不同的控制連接的效果,請使用映射的字典從NSURLConnection s到這些控件,以便執行以下操作:

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

變爲:

[[connectionClients objectForKey:connection] doStuff];