为了测试我的应用程序,我创建了一个JSON文件,我正在从中绘制假值,但是在我的表View中我想要排除用户的数据。为了加载这个文件,我使用了这段代码:
//create a new JSONLoader with a local file from URL
JSONLoader *jsonLoader = [[JSONLoader alloc] init];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"chatters" withExtension:@"json"];
//load the data on a background queue
//use for when connecting a real URL
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
_localChatters = [jsonLoader chattersFromJSONFile:url];
//push data on main thread (reload table view once JSON has arrived)
//[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
});
然后我把它加载到tableView中没有问题:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"PopulationCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
Chatter *chatter = [_localChatters objectAtIndex:indexPath.row];
NSData *fbImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString: chatter.url]];
UIImage *profilePicture = [UIImage imageWithData:fbImageData];
cell.imageView.image =profilePicture;
[cell.textLabel setAdjustsFontSizeToFitWidth: NO];
cell.textLabel.text = [NSString stringWithFormat:@"%@ joined at %@",chatter.name,chatter.joined];
cell.textLabel.textColor = [UIColor grayColor];
return cell;
}
然而,这也包括用户信息,这是我们不想要的。为了解决这个问题,我创建了一个单独的方法,理论上可以创建第二个可变数组,只包含不包括用户的数据:
- (void)getData{
NSLog(@"%@",_localChatters);
NSMutableArray *newArray = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i<[_localChatters count]; i++) {
Chatter *newChatter = [_localChatters objectAtIndex:i];
if ([newChatter.facebookID isEqualToString:_loggedInFBID]) {
} else {
[newArray addObject:newChatter];
};
}
NSLog(@"%@",newArray);
}
然而,当从视图中调用此方法时,确实加载了
[self getData]
_localChatters NSLogs为(null),我相信随后newArray永远不会被填充,NSLogs也是空的()。这很奇怪,因为当我在uitableview中记录_localChatters时,它不是null,当然加载时所有数据都存在。我很遗憾为什么_localChatters在这个方法中读取为null,因为我相当确定数组从dispatch_async请求加载得很好。
编辑:
以下是JSON的一小部分示例,我已删除了一些个人信息,例如FB ID和图片网址,但所有对象都是相同的。
"name": "Johnny",
"room": "London",
"latitude": 41.414483,
"longitude": 2.152579,
"message": "I agree, I think I'm going there right now",
"timestamp": "9:23 PM",
"url": " <<actual FB profile URL>>",
"facebookID":"<<personal FB ID >>",
"joined":"12:13 AM",
答案 0 :(得分:2)
问题是多线程。 _localChatters
数组是异步创建的,因此在大多数情况下,这将在viewDidLoad
之后发生。您可以将[self getData]
移动到dispatch_async
块(在重新加载表视图之前和从JSON获取数据之后)。