我试图获得2个单独的JSON数据对象,其中包含2个Twitter用户提要,但我遇到了很多麻烦。我想同时处理它们并将它们放入表中但是遇到了困难。
我有一个全局的NSMutableData,可以获取附加到它的每个JSON请求。一旦所有这些都在一个地方,我试图用全局NSMutableData更新表。 allTheData是全局NSMutable对象。
if ([twitterAccounts count] > 0) {
while (accountsize != [twitterAccounts count]) {
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
[allTheData appendData:responseData];
}];
accountsize = accountsize + 1;
}}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(receiveData:) withObject:allTheData waitUntilDone:YES];
});
- (void)receiveData:(NSData *)data {
self.tweets = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
[self.TwitterTableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] init];
NSDictionary *tweet = [self.tweets objectAtIndex:indexPath.row];
cell.textLabel.text = [tweet objectForKey:@"text"];
return cell;
}
每当我运行此代码时,它会崩溃并吐出以下内容
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
* 第一次抛出调用堆栈: (0x2622012 0x131ae7e 0x2621deb 0xe4f817 0x568c 0x132e6b0 0xd5b035 0x25a5f3f 0x25a596f 0x25c8734 0x25c7f44 0x25c7e1b 0x290d7e3 0x290d668 0x26265c 0x258d 0x24b5) libc ++ abi.dylib:terminate调用抛出异常
答案 0 :(得分:0)
关于performRequestWithHandler
的Apple文档:
执行异步请求并在完成后调用指定的处理程序。
这意味着您的请求处理程序只会被调用一次,并且不需要附加块。你很可能崩溃,因为代码没有按照你期望的顺序执行。我会尝试将调用receiveData
移动到处理程序块中,以便只有在您实际拥有数据时才会执行它:
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
dispatch_async(dispatch_get_main_queue,^{
[self receiveData:responseData];
});
}];
accountsize = accountsize + 1;
}
}
答案 1 :(得分:0)
这对我来说没有意义:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(receiveData:) withObject:allTheData waitUntilDone:YES];
});
你正在主线程上调用一个方法,为什么要执行dispatch_async呢? 您只应将来自主{{strong}} reloadData
的{{1}}的电话打包。
同样,我会为每个推文调用dispatch_async
,然后将它们添加到数组中。
我认为附加原始数据字节可能会破坏它。
答案 2 :(得分:0)
您应该解析每个json对象并将它们附加到NSMutableArray。使用未解析的json连接NSMutableData对象似乎令人难以置信地倒退。