等待多线程返回

时间:2014-05-29 07:43:46

标签: ios objective-c multithreading

我使用twitter api包装工作的方法上课。我知道我应该使用线程来处理Internet。但是我在这部分编程中有点新鲜。所以我认为这就够了。

-(NSArray*) getTweets:(NSString *)query {
     [self performSelectorOnMainThread:@selector(anotherMethod:) withObject:query waitUntilDone:YES];
     return [self tweets];
}

这就是我在主方法中称之为的方式:

NSString* query = @"query";
id<TwitterGetter> obj = [[className alloc] init];
NSArray* array = [obj getTweets:query];

但NSArray *在此之后是零。我该怎么做才能避免这个问题?我试图从苹果阅读指南,但看起来我没有得到它。

1 个答案:

答案 0 :(得分:2)

要了解究竟发生了什么,我们需要更多的代码,知道你在调用它的线程...无论如何,而是尝试一些回调程序。在你的情况下anotherMethod:应该使用你的数组参数在主线程上调用一些回调方法。

例如,这应该是一个很好的方法:

- (void)buttonPressed:(id)sender {
    //start some spinner or continue with application
    //even some locking mechanism might be needed so this method is not called multiple times
    [self getTweets:@"whatever"];
}
- (void)getTweets:(NSString *)query {
    [self performSelectorInBackground:@selector(anotherMethod:) withObject:query];
}
- (void)anotherMethod:(NSString *)query {
    //get tweets
    NSArray *tweets;
    [self performSelectorOnMainThread:@selector(gotTweets:) withObject:tweets waitUntilDone:NO];
}
- (void)gotTweets:(NSArray *)tweets {
    //stop the spiner if needed
    //unlock if needed
    //do whatever with your data
}

关于同步:

你应该总是避免在主线程上加载和等待。如果您需要屏幕暂停,请尝试添加一些叠加(通常使用一些低alpha)并可能添加UIActivityIndicatorView,以便用户可以看到正在进行某些加载并阻止用户交互,因此他无法进入应用程序。请注意,如果您长时间阻塞主线程,您的应用程序将被终止(称为监视程序),这是您应该在单独的线程上执行所有加载和请求的主要原因。好吧,除了用户可能认为应用程序被卡住并可能会将其杀死的原因。