1

我正在编写一个 iOS 应用程序,它从 web 服务加载数据并将数据放入表视图中。用户可以通过单击单元格然后选择一个值来更新单元格中的数据。选择该值后,我希望表更新以反映新数据,实质​​上是重新从 web 服务进行数据的初始下载。在更新方法结束时,我调用了我的初始加载方法,但这似乎不起作用。它只是重新加载所有原始数据。这是我的更新方法的结尾:

self.connectionInProgress = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

[self loadLines];

和负载线方法:

- (void)loadLines
{   
    NSLog(@"going again?");
    [Results removeAllObjects];
    [Results release];
    Results = nil;
    Results = [[NSMutableArray alloc] init];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString *jsonString = [self performFetchWithURL:lineURL];
        if(jsonString == nil) {
            [self showNetworkError];
            return;
        }

        NSDictionary *dictionary = [self parseJSON:jsonString];
        if(dictionary == nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self showNetworkError];
            });
            return;
        }

        [self parseDictionary:dictionary];

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

parseDictionary 和 performFetchWithURL 是 iOS 5 中非常标准的 JSON 交互...将数据放入 Results 数组中。我是否通过清除我的结果数组然后重新创建它来做正确的事情?

我将如何获得全新的数据?

4

1 回答 1

0

我强烈建议研究 ASIHTTPRequest。它可能是也可能不是您的问题的解决方案,但它会删除许多不必要的代码,使您的项目更易于调试。GCD 很棒,但是当你向它发送垃圾邮件时,它会很快失控并导致像你正在经历的奇怪行为。

http://allseeing-i.com/ASIHTTPRequest/How-to-use

//Unsafe_unretained is for ARC which it doesn't look like you are using.
__unsafe_unretained ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:lineURL]];

// Code inside of this block will run when the request finishes
// This code will also be called to on the main thread. So you can avoid your own GCD
[request setCompletionBlock:^{
    if (![request responseString])
    {
        [self showNetworkError];
        return;
    }
    NSDictionary *dictionary = [self parseJSON:[request responseString]];
    if(dictionary == nil) {
        [self showNetworkError];
        return;
    }

    [self.tableView reloadData];
}];

//This code will run if your request fails
[request setFailedBlock:^{
     NSLog(@"Failed %@", [request error]);
}];

[request startAsynchronous];//Start the request

我会试一试。如果这不能解决您的问题,那么您的问题很可能存在于您尚未发布的代码中。

对于该片段中的任何语法错误,我深表歉意,因为我手头没有编译器。

于 2012-08-10T02:30:37.333 回答