0

我正在通过同步方法从 Web 服务中获取数据。我向 Web 服务发出请求,然后视图冻结。我尝试在从 Web 服务加载数据之前添加 UIActivityIndi​​catorView,并在获取数据后停止它但不显示活动指示器。我试图将 Web 服务数据获取操作放在不同的线程上

[NSThread detachNewThreadSelector:@selector(fetchRequest) toTarget:self withObject:nil];

但此时 TableView 崩溃,因为它没有获取用于绘制单元格的数据。在我正在做的 fetchRequest 函数中

        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                          URLWithString:URLString]];
        NSData *response = [NSURLConnection sendSynchronousRequest:request
                                             returningResponse:nil error:nil];

        NSError *jsonParsingError = nil;
        NSDictionary *tableData = [NSJSONSerialization JSONObjectWithData:response
                                                              options:0
                                                                error:&jsonParsingError];


        responseArray = [[NSMutableArray alloc]initWithArray:[tableData objectForKey:@"data"]];

        for(int i = 0; i < responseArray.count; i++)
        {
            NSArray * tempArray = responseArray[i];
            responseArray[i] = [tempArray mutableCopy];
        }

responseArray用于填写单元格中的信息 请告诉我如何执行此操作。任何帮助将不胜感激 ...

4

2 回答 2

2

问题在于你的方法。Synchronous方法在主线程上运行。并且由于主线程上的 UI 更新,您的应用程序会挂起

因此,解决方案是使用一种asynchronous方法在单独的线程上下载数据,这样您的 UI 就不会挂起

所以,使用NSURLConnection's sendAsynchronousRequest。这是一些示例代码:

NSURL *url = [NSURL URLWithString:@"YOUR_URL_HERE"];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    //this is called once the download or whatever completes. So you can choose to populate the TableView or stopping the IndicatorView from a method call to an asynchronous method to do so.
}]; 
于 2013-11-02T09:38:32.577 回答
1

您最好使用 Grand Central Dispatch 来获取这样的数据,这样您就可以在后台队列中调度它,并且不要阻塞也用于 UI 更新的主线程:

 dispatch_queue_t myqueue = dispatch_queue_create("myqueue", NULL);
    dispatch_async(myqueue, ^(void) {

    [self fetchRequest];
 dispatch_async(dispatch_get_main_queue(), ^{
            // Update UI on main queue
 [self.tableView reloadData];
        });

    });

关于您可以在解析开始时使用的活动指示器:

[self.activityIndicator startAnimating];
self.activityIndicator.hidesWhenStopped = YES

然后当你的表充满数据时:

[self.activityIndicator stopAnimating];
于 2013-11-02T09:40:30.740 回答