Ios 在多线程中等待返回

Ios 在多线程中等待返回,ios,objective-c,multithreading,Ios,Objective C,Multithreading,我得到了一个用twitterapi包装工作的类。我知道我应该使用线程来处理Internet。但我对编程的这一部分有点陌生。所以我决定这就足够了 -(NSArray*) getTweets:(NSString *)query { [self performSelectorOnMainThread:@selector(anotherMethod:) withObject:query waitUntilDone:YES]; return [self tweets]; } 这就是我

我得到了一个用twitterapi包装工作的类。我知道我应该使用线程来处理Internet。但我对编程的这一部分有点陌生。所以我决定这就足够了

-(NSArray*) getTweets:(NSString *)query {
     [self performSelectorOnMainThread:@selector(anotherMethod:) withObject:query waitUntilDone:YES];
     return [self tweets];
}
这就是我在main方法中调用它的方式:

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

但在这之后NSArray是零。我应该怎么做来避免这个问题?我试着阅读苹果公司的指南,但似乎我没有理解。

要了解到底发生了什么,我们需要更多的代码,知道你在哪个线程上调用它。。。无论如何,还是尝试一些回调过程吧。在您的例子中,
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
,以便用户可以看到一些加载正在进行,并阻止用户交互,以便他无法继续进入应用程序。注意:如果阻塞主线程的时间过长,应用程序将被终止(称为看门狗),这就是您应该在单独的线程上执行所有加载和请求的主要原因。好吧,除了用户可能认为应用程序卡住并可能导致其死机的原因之外。

尝试理解您的问题,但无法理解。请详细解释以获得答案考虑到,在主线程中,数组可以是
nil
,因为
getTweets
甚至还没有开始工作。您需要在共享这种状态的两个(或N个)线程之间进行某种同步。谢谢,我知道了。我在考虑回电话,但一开始很后悔。感谢您解释为什么阻塞主线程是不好的。