IOS Tableview需要10秒或更长时间才能填充

时间:2014-02-11 22:50:48

标签: ios uitableview delay

我从使用我的tableview控制器中的NSURLConnection到在单独的类中使用NSURLSession,并在tableview控制器中处理回调。

现在,从我的网站返回的数据不会在填充表格中显示最多20秒,即使它很久以前已加载。

我在tableview的导航栏上有一个“添加”按钮,它会显示另一个视图。当我单击添加按钮时,我可以看到主表视图中的数据已经填充,因为它动画到下一个视图。返回主视图,数据就在那里。

我尝试了多种方法来重新加载数据,但它们没有任何效果。

旧的方式工作正常,只让我有一个连接。我需要根据我可能选择的选项调用几个连接,这是创建一个新类来处理连接并将其回调放在tableview中的原因。

但这造成了无法立即查看已解析的返回数据的问题。

对我而言,它似乎是某种类型的线程问题,但我不知道如何解决它或如何纠正它,所以我希望有人在这里可以提出一些建议。

以下是我的新课程中适用的代码,为了说明的目的,我们将调用NetWorkClass ...

#pragma mark - Get Parents
+ (void)requestParentsWithCompletionHandler:(RequestCompletionHandler)completionBlock {
       NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
       NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"insert url here"]];

       [request setHTTPMethod:@"POST"];
       NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
       [[session dataTaskWithRequest:request completionHandler:completionBlock] resume]; 
 }

这个typdef位于我的新类NetworkClass ...

的头文件中

typedef void (^RequestCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error);

然后在我的tableview控制器类的主线程中,我调用一个方法来调用Network类来从网站中检索JSON数据。

我的tableview控制器中的ViewDidLoad调用了以下代码段

  // Use NSSesssion to request JSON data from my website    [self getParents];

  NSLog(@"getParents has completed!");

  // The view however, will not display for approximately 20 or 30 seconds unless I click on the Add button which instantiates another view     // and then I see the data in the tableview right away as it animates to the new view.    NSLog(@"parentsTable:%@",parentsTable);

NSLog输出以下内容:

  

2014-02-11 16:10:27.385 myApp [12667:70b] parentTable :; layer =; contentOffset:{0,0}>

此时回调尚未处理数据,但网站已发送请求并且正在返回repsonse。

回调是在getParents ...

中实现的
-(void)getParents
{
    [NetWorkClass requestParentsWithCompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
   {
         if (!error) {
            NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
             if (httpResp.statusCode == 200) {

如果响应状态代码为200,我将数据传播到tableview中并通过调用

完成
[parentsTable reloadData];

状态代码检查后的所有代码与在tableview中使用NSURLconnection(及其委托方法)检索数据时的代码相同,所以我没有在此处包含它。

如果我在getParents中的requestParentsWithCompletionHandler处设置断点,并且我从那里单步执行,则第一个传递会跳过我的代码。但是,如果我从那一点开始运行,它会第二次到达断点,然后通过处理响应,这正如我所料,因为我们必须等待几毫秒才能从网站获取数据。

数据已经在几毫秒内到达,但是如果我什么也不做,那么在tableview填充已解析的数据之前可能需要20秒。

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要将结构更改为以下内容:

  1. 在viewDidLoad中您应该调用一个方法来发送数据的异步请求。 (强烈建议使用AFNetworking或restKit来代替尝试使用您当前使用的代码)
  2. 成功后,您应该使用数据和[tableView reloadData]
  3. 填充数组
  4. 您的numberOfRowsInSection应如下所示:

    If (!arrayContainingData) {
       return 0; // For elegance, you can also return 1 and have a cell with an UIActivityMonitor
    } else {
        return arrayContainingData.count;
    }
    
  5. 最后使用cellForRowAtIndexPath构建单元格。