JSON文件在UITableView之前不加载

时间:2014-07-17 15:46:58

标签: ios objective-c json uitableview

为了测试我的应用程序,我创建了一个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",

1 个答案:

答案 0 :(得分:2)

问题是多线程。 _localChatters数组是异步创建的,因此在大多数情况下,这将在viewDidLoad之后发生。您可以将[self getData]移动到dispatch_async块(在重新加载表视图之前和从JSON获取数据之后)。