我有一個問題,我不知道如何解決。在傳遞單個請求時,我可以毫無問題地向REST服務發出請求。多個異步web服務請求NSURLConnection iOS
我現在的問題是根據該負責人我得到一些價值觀,包括ID。所有檢索到的ID都需要另外收集新的信息。
我的猜測是加載數組或字典中的所有特定請求,並從中創建請求。任何人都有關於此的一些有用的提示檢索到的信息將填充UITableView。
我有一個問題,我不知道如何解決。在傳遞單個請求時,我可以毫無問題地向REST服務發出請求。多個異步web服務請求NSURLConnection iOS
我現在的問題是根據該負責人我得到一些價值觀,包括ID。所有檢索到的ID都需要另外收集新的信息。
我的猜測是加載數組或字典中的所有特定請求,並從中創建請求。任何人都有關於此的一些有用的提示檢索到的信息將填充UITableView。
我建議你在這個問題上使用同步異步模式。
你需要實現兩個同步方法:
// Fetch the array of ID's
-(NSArray*)fetchItemIDsWithError:(NSError**)error;
// Fetch the item for a ID
-(Item*)fetchItemForID:(NSString*)itemID error:(NSError**)error;
實現這些使用同步代碼是很簡單的測試。您可以輕鬆使用簡單的方法,如dataWithURL…
,stringWithContentsOfURL…
,sendSynchronousRequest…
或ASIHTTPrequest,併爲此編寫直接的單元測試。代碼也將非常容易維護和擴展,與併發代碼通常如何結束相比。
我們第二步,創建一個異步包裝,我會用這樣的委託和方法簽名:
@protocol FetchItemsDelegate <NSObject>
-(void)didFetchItems:(NSArray*)array;
-(void)failedFetchItemsWithError:(NSError*)error;
@end
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
你已經擁有一切你所需要的代碼,所以你必須做什麼是推動異步的部分。此代碼將很好地分離和直接。 Probaly沒有比這更:
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
{
[self performSelectorInBackground:@selector(backgroundFetchItemsWithDelegate:)
withObject:delegate];
}
-(void)backgroundFetchItemsWithDelegate:(id<FetchItemsDelegate>)delegate;
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
BOOL success = YES;
NSMutableArray* items = [NSMutableArray array];
NSError* error = nil;
NSArray* itemIDs = [self fetchItemIDsWithError:&error];
if (itemIDs) {
for (NSString* itemID in itemIDs) {
Item* item = [self fetchItemForID:itemID
error:&error];
if (item) {
[items addObject:item];
} else {
success = NO;
break;
}
}
} else {
success = NO;
}
if (success) {
[delegate performSelectorOnMainThread:@selector(didFetchItems:)
withObject:[NSArray arraiWithArray:items]
waitUntilDone:NO];
} else {
[delegate performSelectorOnMainThread:@selector(failedFetchItemsWithError)
withObject:error
waitUntilDone:NO];
}
[pool release];
}
我已經寫了關於這一主題在這裏更長的博客文章:http://blog.jayway.com/2011/04/28/sync-asyn-pair-pattern-easy-concurrency-on-ios/
@PeyloW感謝您的回答!我會試一試。我對Objective-C來說很新,所以如果我現在有一個單獨的類來檢索第一個響應來填充ID的數組,我可以爲這些方法創建一個新的類嗎?另一個類對我的viewController進行回調,然後填充TableView。 – Silversnail 2011-05-13 13:33:09
@Silversnail - 我是智能模型對象的支持者。所以,如果這取決於我,我會在'Item'類本身上將方法添加爲類方法。也許在分離類別中,在相同的頭文件中,但如果文件增長到500行或更多,可以選擇在單獨的實現文件中。 – PeyloW 2011-05-13 13:38:08
@PeyloW,我想我也許是點點雛讓我將如何得到這一切在一起,我就看看你的博客獲得一些更多的瞭解。這就是我現在有我的異步連接... stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:47:33
你的問題有點含糊,但我想我可能會理解你的問題。我做http請求時,通常實施用的協議的委託模式:
@protocol HttpDelegate
-(void) httpDidFinish;
-(void) httpError:(NSError *) error;
@end
並在HttpClient的類:
-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
[self.delegate httpDidFinish];
}
您控制器(或其他類)實現HttpDelegate和httpDidFinish要麼使所述第二請求或填充你的表格。在這種情況下,因爲這是一個兩步過程,所以我可能會添加另一個類TwoStepProcessor和TwoStepProcessorDelegate,而不是在控制器中實現HttpDelegate。 TwoStepProcessorDelegate就像HttpDelegate除了它具有:
-(void) secondStepFinished:
你的控制器實施。
它的解決方案取決於您現有的實現(我在這裏只考慮兩種情況。)
案例一:If you are having a different class for managing connection related task, a separate class that has NSURLConnection Delegate methods.(Asynchronous..)
案例二:If its singleton or in the same class which you are using.(we can not create it's multiple objects)..(it will have the performance cost.) one by one request.
如果您發佈我們你是如何處理連接活動這會有所幫助。
謝謝,
這是我如何做連接的結構。 http://stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:36:07
所以在你的單元格你有一些看法你的日程安排顯示,UILabel或類似的東西? – Ravin 2011-05-13 13:53:43
是的! UIlabel – Silversnail 2011-05-13 13:56:12
你的要求是這樣的。 req ---> response(用於另一個req並存儲一些信息) - > response(再次提出新的請求並存儲/使用一些信息)---> response ..等等? – Ravin 2011-05-13 13:04:33
是的,但問題是第一個請求在一個請求中檢索到我需要的所有內容。例如,我回來了20人,每個人都有一個ID。我想取每個ID並提出20個請求來爲每個ID取回一個時間表。棘手的是,第一個響應使用名稱填充UITableView。每個名字後我想把他們的個人日程安排。我不知道這使我的問題更清楚。 – Silversnail 2011-05-13 13:11:56