0

我有一个关于如何刷新 iOS 应用程序 UI 的问题。我想要实现的是:

  1. 根据从 Web 服务检索到的数据在 UITableView 中显示数据
  2. 应从单独的线程(不是主线程)调用 Web 服务
  3. 取到数据后,会用取到的数据刷新UITableView的内容
  4. 这是由于在网络连接不良的情况下,在从 Web 服务接收数据的过程中,UI 不会挂起或应用程序不会阻止用户输入

为此,我创建了以下源代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *myURL = [[NSURL alloc] initWithString:[Constant webserviceURL]];
    NSURLRequest *request = [NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData                        timeoutInterval:60];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    [self myparser] = [[MyXMLParser alloc] initXMLParser];

    [parser setDelegate:myparser];
    BOOL success = [parser parse];
    if (success) {
        // show XML data to UITableView
        [_tableView performSelectorOnMainThread:@selector(reloadData) withObject:[myparser xmldata] waitUntilDone:NO];
    }
    else {
        NSLog(@"Error parsing XML from web service");
    }
}

================== 我的实现是否正确?有人知道如何解决吗?

4

1 回答 1

0

你会想打电话

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

它将调用以在不同的线程上获取数据,然后当数据被拉下或从 url 下载数据时出现问题时,它将在与原始调用相同的线程上调用您的处理程序块。

这是使用它的一种方法:https ://stackoverflow.com/a/9409737/1540822

你也可以使用

- (id)initWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate

当数据在卡盘中下载时,这将调用您的 NSURLConnectionDelegate 方法之一。如果您将拥有大量数据,那么您可能希望使用它,这样您就不会在响应中花费太多时间。

于 2012-07-23T06:47:15.853 回答