我从使用我的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秒。
对此的任何帮助将不胜感激。
答案 0 :(得分:0)
您需要将结构更改为以下内容:
[tableView reloadData]
您的numberOfRowsInSection应如下所示:
If (!arrayContainingData) {
return 0; // For elegance, you can also return 1 and have a cell with an UIActivityMonitor
} else {
return arrayContainingData.count;
}
最后使用cellForRowAtIndexPath构建单元格。