Ios 在Objective C中将两个单独的JSON数据对象合并为一个
我试图得到2个单独的JSON数据对象,其中包含2个twitter用户提要,但我遇到了很多麻烦。我想同时处理它们并把它们放在一张桌子上,但我有困难 我有一个全局NSMutableData,它获取附加到它的每个JSON请求。一旦所有数据都放在一个地方,我就会尝试用全局NSMutableData更新表。allTheData是全局可更改对象Ios 在Objective C中将两个单独的JSON数据对象合并为一个,ios,objective-c,json,nsdata,nsmutabledata,Ios,Objective C,Json,Nsdata,Nsmutabledata,我试图得到2个单独的JSON数据对象,其中包含2个twitter用户提要,但我遇到了很多麻烦。我想同时处理它们并把它们放在一张桌子上,但我有困难 我有一个全局NSMutableData,它获取附加到它的每个JSON请求。一旦所有数据都放在一个地方,我就会尝试用全局NSMutableData更新表。allTheData是全局可更改对象 if ([twitterAccounts count] > 0) { while (accountsize != [twitterAccounts c
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 0x2621DB 0xe4f817 0x568c 0x132e6b0 0xd5b035 0x25a5f3f 0x25a596f 0x25c8734 0x25c7f44 0x25c7e1b 0x290d7e3 0x290d668 0x26265c 0x258d 0x24b5)
libc++abi.dylib:terminate调用引发异常,该异常来自Apple文档中有关
performRequestWithHandler的:
执行异步请求并在完成时调用指定的处理程序
这意味着您的请求处理程序将只被调用一次,并且不需要追加块。很可能是因为代码没有按预期的顺序执行而导致崩溃。我会尝试将对receiveData
的调用移动到处理程序块中,以便仅当您实际拥有数据时才执行该调用:
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
dispatch_async(dispatch_get_main_queue,^{
[self receiveData:responseData];
});
}];
accountsize = accountsize + 1;
}
}
这对我来说毫无意义:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(receiveData:) withObject:allTheData waitUntilDone:YES];
});
您正在主线程上调用一个方法,那么为什么要执行dispatch\u async呢您应该只在主队列上的dispatch\u async
中包装对reloadData
的调用。
同样,我会为每个tweet调用JSONObjectWithData:options:error:
,然后将它们添加到数组中
我认为附加原始数据字节可能会破坏它。您应该解析每个json对象并将它们附加到NSMutableArray。将NSMutableData对象与未解析的json连接起来似乎有着惊人的倒退。请添加“receiveData”的代码,如果您的代码段包含在另一个块中,请添加相关代码。或者至少解释一下第5行的“}}”关闭了什么。