TwitterRequest块同步IOS5

TwitterRequest块同步IOS5,twitter,ios5,objective-c-blocks,Twitter,Ios5,Objective C Blocks,我试图在xcode和ios5上工作,我有一个Twitter请求使用Twitter Api关闭推文。然而,我对iOS5中的块是如何工作的感到困惑。例如,在本代码中 [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSDictionary *dictionary = [NSJSONSerialization JSONOb

我试图在xcode和ios5上工作,我有一个Twitter请求使用Twitter Api关闭推文。然而,我对iOS5中的块是如何工作的感到困惑。例如,在本代码中

 [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
    NSArray* firstParse = [dictionary objectForKey:@"results"];

    for (NSDictionary *post in firstParse) {               
        Tweet *tweetMessage = [[Tweet alloc] init];
        tweetMessage.message =  [post objectForKey:@"text"];
        tweetMessage.user =  [post objectForKey:@"from_user"];

        [tweets addObject:tweetMessage];
    }
}];
NSLog(@"%@",[tweets count]);
假设我有一个tweets=[NSMutableArray arraywhithcapacity:25];给上面的某个地方打电话

然而,每次我这样做,计数总是为零。在做了一些测试之后,我意识到块代码是在NSLog运行之后运行的,这意味着代码并不像我以前那样自上而下运行

有人知道如何解决这样的问题吗

我还尝试了这个稍后的示例,因为我试图将tweets移动到具有数组对象的viewController中

tweetViewController.tweets = [NSMutableArray arrayWithCapacity:25];
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
    NSArray* firstParse = [dictionary objectForKey:@"results"];

    for (NSDictionary *post in firstParse)
    {               
        Tweet *tweetMessage = [[Tweet alloc] init];
        tweetMessage.message =  [post objectForKey:@"text"];
        tweetMessage.user =  [post objectForKey:@"from_user"];

        [tweetViewController.tweets addObject:tweetMessage];

        NSLog(@"%d",[tweets count]);
        //NSLog(@"%@: %@", [post objectForKey:@"from_user"], [post objectForKey:@"text"]);            
    }
}];

Tweet *tweetMessage = [[Tweet alloc] init];
tweetMessage.message =  @"HELLO";
tweetMessage.user =  @"HELLO";
[tweetViewController.tweets addObject:tweetMessage];
return YES;

Hello消息显示正确,但块中的消息显示不正确

不要。基本上,将重点放在使代码异步上。这对用户来说会更好(UI会更平滑),对开发人员来说也会更容易(是的,真的!)

在块中加载推文,而不是在块之后加载推文。将
NSLog
放在块中而不是块外。加载完所有tweet后,只需调用
[tableView performselectornmainthread:@selector(reloadData)with object:nil waitUntilDone:NO]或其他内容,以更新UI


确保避免在存储
tweets
的属性上使用
非原子
标志。您希望避免无效的跨线程访问。

不要这样做。基本上,将重点放在使代码异步上。这对用户来说会更好(UI会更平滑),对开发人员来说也会更容易(是的,真的!)

在块中加载推文,而不是在块之后加载推文。将
NSLog
放在块中而不是块外。加载完所有tweet后,只需调用
[tableView performselectornmainthread:@selector(reloadData)with object:nil waitUntilDone:NO]或其他内容,以更新UI



确保避免在存储
tweets
的属性上使用
非原子
标志。您希望避免无效的跨线程访问。

如果不一定要执行同步代码,请不要执行同步代码。那么我将如何调用请求?就像这样,但我的意思是您应该允许代码异步执行。将与tweet加载相关的代码放在块中。我现在也尝试了,使用此代码是因为我最初尝试将twitter传输到viewController的表中
[tweetViewController.tweets addObject:tweetMessage]并且我在块外用一个'Tweet*tweetMessage=[[Tweet alloc]init]测试了它;tweetMessage.message=@“你好”;tweetMessage.user=@“你好”;[tweetViewController.tweets添加对象:tweetMessage];返回YES;`hello消息在视图控制器上正确显示,而块中的消息不显示如果不一定要显示,则不执行同步代码。那么我将如何调用该请求?就像这样,但我的意思是您应该允许代码异步执行。将与tweet加载相关的代码放在块中。我现在也尝试了,使用此代码是因为我最初尝试将twitter传输到viewController的表中
[tweetViewController.tweets addObject:tweetMessage]并且我在块外用一个'Tweet*tweetMessage=[[Tweet alloc]init]测试了它;tweetMessage.message=@“你好”;tweetMessage.user=@“你好”;[tweetViewController.tweets添加对象:tweetMessage];返回YES;`hello消息在视图控制器上正确显示,而块中的消息不显示。只是想知道,您将在哪里调用重新加载数据,我正在应用程序中执行所有操作。您真的应该在视图控制器中使用所有这些代码。应用程序委托实际上不应该做这些事情——它负责处理应用程序本身(启动、关闭、暂停、恢复等)。performSelectorOnMainThread是如何工作的?我是在视图控制器上调用它,还是在视图控制器内部调用它。你是在应该显示推文的UITableView上调用它,还是在用来显示推文的任何东西上调用它。不要使用执行选择器,所以使用passéuse dispatch_async(dispatch_get_main_queue(),^{});不要只是想知道,你会在哪里调用重新加载数据,我现在正在做应用程序中的所有事情。你真的应该在视图控制器中使用所有这些代码。应用程序委托实际上不应该做这些事情——它负责处理应用程序本身(启动、关闭、暂停、恢复等)。performSelectorOnMainThread是如何工作的?我是在视图控制器上调用它,还是在视图控制器内部调用它。你是在应该显示推文的UITableView上调用它,还是在用来显示推文的任何东西上调用它。不要使用执行选择器,所以使用passéuse dispatch_async(dispatch_get_main_queue(),^{});相反