2012-11-26 60 views
0

Okey夥計。這可能有點新手,但是我很難弄清楚如何在我擁有的幫助類中觸發NSURLConnection委託。如何觸發幫助類別中的委託方法

的問題是如下:

我有一個將執行登錄Web服務的視圖控制器。我從我的視圖中設置「連接」對象。

在連接-I類設置一個請求對象(NSMutableURLRequest *請求)

然後我建立的連接。

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
if (connection) { 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    dataWebService = [NSMutableData data]; 
    [connection start]; 
} else { 
    // Inform the user that the connection failed. 
} 

的線索是,我這樣做的視圖控制器類時(將所有代表)我的視圖控制器內,則代表自動觸發,我可以登錄到Web服務。

如何從「視圖控制器」內部的「連接類」中調用這些委託?

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

我需要這個,因爲我將使用此連接類來執行其他視圖的其他任務。在我所有的觀點中寫這些代表會有點矯枉過正。

回答

0

您可以在連接類中使用類似downloadFromURL:sender:的方法,您可以從任何類中調用該方法。當你調用它的時候,你提供了URL並提供self作爲發送者參數。連接類將有一個屬性,說sendingObject,你會設置爲發件人:

-(void)downloadFromURL:(NSURL *) url sender:(id) sender { 
    _receivedData = [[NSMutableData alloc] init]; 
    sendingObject = sender; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url cachePolicy: NSURLCacheStorageAllowedInMemoryOnly timeoutInterval: 30.0]; 
    [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

實現此類中的所有委託方法,並在connectionDidFinishLoading:方法,你可以做這樣的事情:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    [sendingObject performSelector:@selector(resultFromDownloader:) withObject:_receivedData]; 
} 

這將允許您處理數據(在resultFromDownloader :)中,但是您需要在任何調用此方法的類中使用。

0

你可能會說把NSURLConnection及其委託方法放在任何你需要的地方是矯枉過正的,但它絕對是最乾淨的解決方案。

使用委託時,您應該有1個發件人(在本例中爲NSURLConnection)和1個接收者(在本例中爲ViewController)。你想要做的是要麼不斷更換接收器,要麼有多個接收器,我不完全確定。你可以做。如果你想重用NSURLConnection(因此保留1個接收器),你可以簡單地將它的委託更改爲當前需要的類。這可能難以追蹤。如果您想要將一個連接的結果傳遞給其他類(多個接收者),則可以實施一次委託方法,並使用NSNotifications將結果發送給註冊爲觀察者的每個類。但通知不能返回值。

0

如何完全避免代表?在iOS5的或更高版本,可以運行連接並處理塊的響應,這樣的:

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
     // handle response, data and error here 
    }]; 

使用這種方法,你可以有一個類接聽NSURLConnection的,另外一塊運行它。或者,您可以創建一個創建連接的類並使用作爲參數傳遞的塊來運行它。

+0

謝謝。我會嘗試不同的營養。但使用塊的想法聽起來像是一個很好的做法。 –

相關問題