爲了在目標c中使用異步http請求,您需要將代理設置爲NSURLConnection
。問題是我需要做出多個http請求,所以擁有相同的委託(self)將無法工作。在obj-c中創建非自我委託
什麼是最好的方式去做這件事?我應該爲每個http請求創建一個新的委託類嗎?這些代表只是NSObject嗎?
爲了在目標c中使用異步http請求,您需要將代理設置爲NSURLConnection
。問題是我需要做出多個http請求,所以擁有相同的委託(self)將無法工作。在obj-c中創建非自我委託
什麼是最好的方式去做這件事?我應該爲每個http請求創建一個新的委託類嗎?這些代表只是NSObject嗎?
您有幾個選項。這兩個是最普通的有:
創建一個新的類爲每個連接(是的,NSObject
一個子類),並將其設置爲代表 - 讓他們進行任何你需要的邏輯,當數據被加載
設置一個班級作爲代表並存儲對您所有NSURLConnection
s的引用。這樣,當您的代理獲取- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
調用,您可以測試NSURLConnection
正在使用(如if ([connection == myConnection])
- 或任何委託方法你實現)
這應該工作,但是還有另外一個值得考慮的選擇。你可以創建一個通用類,創建並調用NSURLConnection
,只要它們足夠普遍。然後保留類的NSArray
或NSDictionary
。每個連接一個。
例如:我有一個應用程序需要同時下載多張照片。因此,我有一個GetFlickrPhoto
類。它有一個自定義的init方法來接收URL和其他必要的信息。每個班級創建NSURLConnection
,並且可以安全地將代理設置爲self
這有助於保持包含內容並且非常易於管理/可重複使用。
把它更進了一步:
我前面提到的應用程序,還需要下載JSON飼料。所以我創建了一個GenericDownload
類,它接受URL並異步下載NSData
,然後通過定義的成功/失敗協議將NSData
返回給調用委託。它並不關心NSData
包含什麼。
我改造了GetFlickrPhoto
致電GenericDownload
並使用返回的NSData
的照片。然後我創建了一個GetJSON
類,也稱爲GenericDownload
,並將返回的NSData
解析爲JSON提要。
需要多一點時間,但最終你會很高興維護和未來的項目。
我所做的是創建一個類來處理下載文件,並通過選擇器通知我。我將它傳遞給一個委託,一個選擇器和它需要執行下載的信息。
- (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爲類以響應,並已委派符合應答。