2011-04-22 19 views
1

爲了在目標c中使用異步http請求,您需要將代理設置爲NSURLConnection。問題是我需要做出多個http請求,所以擁有相同的委託(self)將無法工作。在obj-c中創建非自我委託

什麼是最好的方式去做這件事?我應該爲每個http請求創建一個新的委託類嗎?這些代表只是NSObject嗎?

回答

5

您有幾個選項。這兩個是最普通的有:

  • 創建一個新的類爲每個連接(是的,NSObject一個子類),並將其設置爲代表 - 讓他們進行任何你需要的邏輯,當數據被加載

  • 設置一個班級作爲代表並存儲對您所有NSURLConnection s的引用。這樣,當您的代理獲取- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data調用,您可以測試NSURLConnection正在使用(如if ([connection == myConnection]) - 或任何委託方法你實現)

0

這應該工作,但是還有另外一個值得考慮的選擇。你可以創建一個通用類,創建並調用NSURLConnection,只要它們足夠普遍。然後保留類的NSArrayNSDictionary。每個連接一個。

例如:我有一個應用程序需要同時下載多張照片。因此,我有一個GetFlickrPhoto類。它有一個自定義的init方法來接收URL和其他必要的信息。每個班級創建NSURLConnection,並且可以安全地將代理設置爲self

這有助於保持包含內容並且非常易於管理/可重複使用。

把它更進了一步:

我前面提到的應用程序,還需要下載JSON飼料。所以我創建了一個GenericDownload類,它接受URL並異步下載NSData,然後通過定義的成功/失敗協議將NSData返回給調用委託。它並不關心NSData包含什麼。

我改造了GetFlickrPhoto致電GenericDownload並使用返回的NSData的照片。然後我創建了一個GetJSON類,也稱爲GenericDownload,並將返回的NSData解析爲JSON提要。

需要多一點時間,但最終你會很高興維護和未來的項目。

1

我所做的是創建一個類來處理下載文件,並通過選擇器通知我。我將它傳遞給一個委託,一個選擇器和它需要執行下載的信息。

- (void) downloadFileFrom:(NSString*) httpLocation respondAt:(SEL)selector on:(id)target withParam:(id)param 
{ 
    self.finishSelector = selector; 
    self.delegate = target; 
    self.responseParams = param; 
} 

該類是它自己的NSURLConnection委託。因此,實例與其他實例可以分開,並處理爲我創建自己的結果。我堅持參數對象。這可能是任何事情。

在下載結束時,它執行performSelector:在委託上。將自己傳遞給代表。

if ([self.target respondsToSelector:self.selector]) 
{ 
    [self.target performSelector:self.selector withObject:self.param]; 
} 

,那麼你可以創建下載的一個實例,並調用你的方法...告訴它哪裏給您回覆。

MyDownloader downloader = [[MyDownloader alloc] init]; 
[downloader downloadFileFrom:@"http://www.mydomain.com/myimage" respondAt:@selector(myFileIsComplete:) on:self withParam: downloader]; 
[downloader autorelease]; 

另一種選擇是創建一個@protocol爲類以響應,並已委派符合應答。