从iOS中的其他线程访问UI组件

时间:2012-07-23 06:17:01

标签: ios multithreading user-interface

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

  1. 根据从Web服务检索的数据在UITableView中显示数据
  2. 应该从单独的线程(不是主线程)调用Web服务
  3. 检索数据后,它将使用检索到的数据刷新UITableView的内容
  4. 这是因为在不良网络连接中从Web服务接收数据的过程中UI不会挂起或应用程序不会阻止用户输入
  5. 为此,我创建了以下源代码:

    - (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");
        }
    }
    

    ================== 我的实施是否正确?有谁知道如何解决它?

1 个答案:

答案 0 :(得分: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

当在chucks中下载数据时,这将调用您的NSURLConnectionDelegate方法之一。如果您要获得大数据,那么您可能希望使用此数据,这样您就不会在响应中花费太多时间。