5

我有一個問題,我不知道如何解決。在傳遞單個請求時,我可以毫無問題地向REST服務發出請求。多個異步web服務請求NSURLConnection iOS

我現在的問題是根據該負責人我得到一些價值觀,包括ID。所有檢索到的ID都需要另外收集新的信息。

我的猜測是加載數組或字典中的所有特定請求,並從中創建請求。任何人都有關於此的一些有用的提示檢索到的信息將填充UITableView。

+0

你的要求是這樣的。 req ---> response(用於另一個req並存儲一些信息) - > response(再次提出新的請求並存儲/使用一些信息)---> response ..等等? – Ravin 2011-05-13 13:04:33

+0

是的,但問題是第一個請求在一個請求中檢索到我需要的所有內容。例如,我回來了20人,每個人都有一個ID。我想取每個ID並提出20個請求來爲每個ID取回一個時間表。棘手的是,第一個響應使用名稱填充UITableView。每個名字後我想把他們的個人日程安排。我不知道這使我的問題更清楚。 – Silversnail 2011-05-13 13:11:56

回答

4

我建議你在這個問題上使用同步異步模式。

你需要實現兩個同步方法:

// 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/

+0

@PeyloW感謝您的回答!我會試一試。我對Objective-C來說很新,所以如果我現在有一個單獨的類來檢索第一個響應來填充ID的數組,我可以爲這些方法創建一個新的類嗎?另一個類對我的viewController進行回調,然後填充TableView。 – Silversnail 2011-05-13 13:33:09

+0

@Silversnail - 我是智能模型對象的支持者。所以,如果這取決於我,我會在'Item'類本身上將方法添加爲類方法。也許在分離類別中,在相同的頭文件中,但如果文件增長到500行或更多,可以選擇在單獨的實現文件中。 – PeyloW 2011-05-13 13:38:08

+0

@PeyloW,我想我也許是點點雛讓我將如何得到這一切在一起,我就看看你的博客獲得一些更多的瞭解。這就是我現在有我的異步連接... stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:47:33

0

你的問題有點含糊,但我想我可能會理解你的問題。我做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: 

你的控制器實施。

0

它的解決方案取決於您現有的實現(我在這裏只考慮兩種情況。)

案例一If you are having a different class for managing connection related task, a separate class that has NSURLConnection Delegate methods.(Asynchronous..)

  • 您將需要運行一個for循環,要求所有日e 20 ID請求,爲他們註冊通知,ID爲通知的名稱。當連接完成它的加載時,它會發佈一個通知給你的觀察班,在這裏使用通知的名字,你可以更新各自ID的相關時間表。 [在這裏,您將需要該連接處理程序類的創建不同的對象] ...在這裏,你將需要等待時間表載你能做什麼,你可以把一個活動的指標細胞的附屬視圖,直到時間表被加載。(你可以顯示在這種情況下,名稱)

案例二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.

  • 您將需要一個發送請求和一個更新單元格的內容,直到它完成。這意味着你發送ID 1的請求,當它的響應到來時,你可以更新單元併發送下一個請求。等等。

如果您發佈我們你是如何處理連接活動這會有所幫助。

謝謝,

+0

這是我如何做連接的結構。 http://stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:36:07

+0

所以在你的單元格你有一些看法你的日程安排顯示,UILabel或類似的東西? – Ravin 2011-05-13 13:53:43

+0

是的! UIlabel – Silversnail 2011-05-13 13:56:12