TwitterRequest块同步IOS5
我试图在xcode和ios5上工作,我有一个Twitter请求使用Twitter Api关闭推文。然而,我对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
[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(),^{});相反