これはおそらく明らかですが、私は少し初心者で、これを理解しようと何時間も費やしました。
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) に必要な情報が入力されていることは明らかです。
ただし、最初のメソッドの後に viewDidLoad() で再度呼び出すと、 self.messages は空です。これは私が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 の前に実際の関数を呼び出したにもかかわらず、デリゲート メソッドからの出力が最後にデリゲートされる理由を知っている人はいますか?
どんな助けでも大歓迎です!