0

这可能很明显,但我有点新手,花了几个小时试图弄清楚这一点。

在 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 之前调用了实际函数,为什么还要委托委托方法的输出?

任何帮助表示赞赏!

4

1 回答 1

0

我对MGTwitterEngine一无所知,但显然-getSearchResultsForQuery:是一种异步方法;它会立即返回并在结果可用时调用您的委托方法。

您的数组为空,-viewDidLoad因为尚未收到结果。此外,您的数组将始终为空,-viewDidLoad因为在您将控制权返回给运行循环之前无法调用您的委托方法。

于 2009-12-06T04:52:02.707 回答