如何在下载json后重新加载表

时间:2014-08-24 15:16:56

标签: ios objective-c json nsoperation

在以JSON格式下载数据后重新加载表时出现问题。

使用NSOperation下载数据异步。

我使用它的代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self loadInformactionToSql];
}
-(void)loadInformactionToSql {
    NSOperationQueue * queue = [NSOperationQueue new];
    NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadJSONBDD) object:nil];
    [queue addOperation:operation];
}

-(void)downloadJSONBDD {
    NSURL * url = [NSURL URLWithString:@"http://judokatium.com/index.php/api/Belts/getBeltsWithTechnicals"];
    //Leer el JSON

    NSData * allCinturonesTecnicasJson =
    [[NSData alloc] initWithContentsOfURL:url];

    NSError *error;

    NSArray * allCinturonesJson =
    [NSJSONSerialization JSONObjectWithData:allCinturonesTecnicasJson options:kNilOptions error:&error];

    if(error) {
        NSLog(@"%@, %@", [error localizedDescription], [error localizedFailureReason]);
    } else {
        NSDictionary * cintns;
        cinturones = [[NSMutableArray alloc] init];
        for(int i = 0; i < [allCinturonesJson count]; i++){
            JLMCinturon * cinturon = [[JLMCinturon alloc] init];

            cintns = [allCinturonesJson objectAtIndex:i];

            cinturon.idCinturon = [cintns objectForKey:@"id"];

            [cinturones addObject:cinturon];


        }
        [self.tablaCinturones reloadData];
        self.tablaCinturones.hidden = NO;
    }
}

下载的数据是正确的,但未在表格中显示。

我该如何解决?

谢谢,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:3)

把这些行

[self.tablaCinturones reloadData];
self.tablaCinturones.hidden = NO;

进入一个调度块,将它们移动到主线程

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tablaCinturones reloadData];
    self.tablaCinturones.hidden = NO;
});

问题是NSOperation将您的方法调用移动到另一个线程,并且iOS中的UI不能从任何线程更新,而是主要的。

或者,您可以使用NSOperation,就像@JulianKról所指出的那样。

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
NSInvocationOperation *reloadOperation = [[NSInvocationOperation alloc] initWithTarget:self.tablaCinturones selector:@selector(reloadData) object:nil];
NSInvocationOperation *hiddenOperation = [[NSInvocationOperation alloc] initWithTarget:self.tablaCinturones selector:@selector(setHidden:) object:@(NO)];
[mainQueue addOperation:reloadOperation];
[mainQueue addOperation:hiddenOperation];