如何在viewDidAppear方法或viewDidLoad中请求JSON数据?

时间:2013-06-27 15:42:43

标签: iphone ios objective-c nsjsonserialization

如果我从viewDidLoad调用[self requestData];,那么我的表就可以很好地填充数据。如果我将[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 个答案:

答案 0 :(得分:2)

你正试图优化错误的东西。

你有一个滞后的原因是你的url请求是同步的,所以它在等待接收数据时阻塞主线程。使用异步URL请求将为您提供更好的性能优势,可以像您尝试的那样移动加载调用。

答案 1 :(得分:1)

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

每次出现视图时都会调用

ViewDidAppear,它实际上并不是为了保留对象

“滞后”是因为JSON帖子请求在主线程上,因此您的UI没有响应。

答案 2 :(得分:0)

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

在绘制视图后调用

viewDidAppear。在这里设置影响显示的数据为时已晚。您可以在viewWillAppear中加载数据,但请注意,可能会多次调用该数据(例如,在应用之间切换)。

这就是设置影响显示效果的数据在viewDidLoad中工作的原因,而不是viewDidAppearviewDidLoad在视图控制器的生命周期中只被调用一次。

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

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

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

答案 3 :(得分:0)

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

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

你应该在viewDidLoad

中调用它