0

如果我调用[self requestData];from viewDidLoad 我的表会很好地填充数据。如果我移动[self requestData];到 viewDidAppear 方法,表仍然是空的。

另外,我不完全确定是否 [self.mainTableView reloadData];有效。我正在尝试将数据请求和处理移至 viewDidAppear 方法,因为我在代码示例中看到了该模式,并认为它可能会加快我的应用程序启动速度。目前,从应用启动 Default.png 到 rootViewController 存在相当大的延迟。

感谢您对此的任何帮助。

-(void)viewDidAppear:(BOOL)animated
{

    [self requestData];
}



-(void)requestData {

    [HUD showUIBlockingIndicatorWithText:@"Fetching JSON"];

    NSError *requestError = nil;


    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                          URLWithString:kURL]];

    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&requestError];

    NSError *jsonParsingError = nil;

    if (requestError)
    {
        NSLog(@"sync. request failed with error: %@", requestError);
    }
    else
    {
        // handle data
        publicData =  [NSJSONSerialization JSONObjectWithData:response
                                                                    options:0
                                                                      error:&jsonParsingError];
        publicDataArray = [publicData objectForKey:@"data"];

    }

    /*
     for(publicDataDict in publicDataArray) {
     NSLog(@"data output is %@",[publicDataDict objectForKey:@"title"]);

     }
     */
    [self.mainTableView reloadData];

        NSLog(@"reload table cat id %@", categoryString);

    [HUD hideUIBlockingIndicator];
}
4

4 回答 4

2

你试图优化错误的东西。

您有延迟的原因是您的 url 请求是同步的,因此它在等待接收数据时阻塞了主线程。使用异步 URL 请求将为您提供比您尝试移动加载调用更好的性能优势。

于 2013-06-27T15:49:14.160 回答
1

viewDidLoad是发出 JSON 请求的正确位置,因为它被调用一次,并将数据保存到内存中。

ViewDidAppear每次视图出现时调用,它并不是真正保留对象

“滞后”是您的 UI 没有响应的事实,因为 JSON 发布请求位于主线程上。

于 2013-06-27T15:46:59.280 回答
0

为了加快启动尝试异步加载数据,如下所示:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self requestData];
}];

你应该在 viewDidLoad 中调用它

于 2013-06-27T16:11:10.583 回答
0

viewDidLoad在创建视图之后,但在绘制它们之前调用。

viewDidAppear在绘制视图后调用。在这里设置影响显示的数据已经来不及了。您可能会在 中加载数据viewWillAppear,但请注意它可能会被多次调用(例如在应用程序之间切换)。

这就是为什么影响显示的设置数据在 中有效viewDidLoad,但在 中无效viewDidAppearviewDidLoad在视图控制器的生命周期中只调用一次。

但是,如果您的用户的 Internet 连接缓慢或服务器响应缓慢,请考虑用户体验。您的应用程序似乎会“冻结”一段时间。

考虑使用异步请求,而不是同步请求。您可以在请求返回之前显示“正在加载”消息、微调器或其他内容,然后直接更新 UI。

Apple 强烈建议在从主 UI 线程运行时始终发出异步请求。

于 2013-06-27T16:08:01.317 回答