2009-12-06 21 views
0

這可能很明顯,但我是一個新手,花了幾個小時試圖弄清楚。iPhone SDK:viewDidLoad()看到一個空的NSArray,但它被填充到一個委託方法中(MGTwitterEngine)

In viewDidLoad()我使用輸入調用了MGTwitterEngine對象(自定義對象)上的函數。如果請求(在這種情況下爲Twitter)成功,它會調用適當的委託方法。

在viewDidLoad中(),是這樣的:

[myTwitterEngine getSearchResultsForQuery:@"#quote" sinceID:0 startingAtPage:0 count:10]; 

它在一個成功的搜索請求的情況下,調用委託方法如下:

- (void)searchResultsReceived:(NSArray *)searchResults forRequest:(NSString *)connectionIdentifier 
{ 
    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];  

    if ([searchResults count] > 0) 
    { 
     for (int n=0; n < 15; n++) { 

     NSDictionary *singleResult = [searchResults objectAtIndex:n]; 

     NSString *fromUser = [singleResult valueForKey:@"from_user"]; 
     NSString *text = [singleResult valueForKey:@"text"]; 

     Message *newMessage = [[Message alloc] initWithUsername:fromUser message:text]; 

     [tempArray addObject:newMessage]; 
     } 

     self.messages = tempArray; 

     // Okay, works here. 
     NSLog(@"From delegate method: \n %@", [[self.messages objectAtIndex:13] theMessage]); 
    } 
} 

事情我不能弄清楚是這樣的:最後,我說「好吧,工作在這裏」,很明顯self.messages(一個NSArray)被填充了我想要的信息。

但是,self.messages是空的,如果我在第一個方法後的viewDidLoad()中再次調用它。這是我在viewDidLoad()中所做的:

[myTwitterEngine getSearchResultsForQuery:@"#quote"]; 
NSLog(@"\n Before Or After? \n"); 
NSLog(@"From viewDidLoad: %@", [[self.messages objectAtIndex:13] theMessage]); 

結果很奇怪。第一個NSLog的結果出現在委託方法的結果之前。這裏的控制檯輸出:

2009-12-05 23:15:20.758 Entendu[54463:207] 
Before Or After? 
2009-12-05 23:15:20.761 Entendu[54463:207] From viewDidLoad: (null) 
2009-12-05 23:15:21.005 Entendu[54463:207] Request succeeded for connectionIdentifier = 92B2E7EC-AA2F-4301-812E-E8E5AEAF7035 
2009-12-05 23:15:21.007 Entendu[54463:207] From delegate method: 
RT @thankfulnotes: RT @felicelam It usually takes me more than three weeks to prepare a good impromptu speech. Mark Twain #quote 

最終我想使用消息數組作爲表的數據源。我如何從實現中的其他地方的委託方法中訪問此變量?

任何人都知道爲什麼委託來自委託方法的輸出到最後,即使我之前或之後的NSLog調用實際功能?

任何幫助表示讚賞!

回答

0

我對MGTwitterEngine一無所知,但顯然-getSearchResultsForQuery:是一種異步方法;它會立即返回,並在結果可用時稍後調用委託方法。

您的數組在-viewDidLoad中爲空,因爲結果尚未收到。此外,您的數組總是-viewDidLoad中爲空,因爲只有在將控制權返回到運行循環後才能調用委託方法。

+0

謝謝!我的做法完全錯誤。 我有一種感覺,viewDidLoad()繼續沒有數據,但不知道如何最終用它更新我的表。在突然啓示的瞬間,我意識到我可以簡單地做一個[self.tableView reloadData]。它完成了! 再次,謝謝! – Parimal 2009-12-06 05:05:13

相關問題