use*_*108 2 sdk uitableview reloaddata ios tbxml
我正在使用TBXML + HTTP从网站获取XML数据.我想要做的是用处理过的数据填充UITableView.我已经创建了一个包含所有条目的NSMutableArray,并且就此而言,一切正常.问题是,在成功从服务器获取数据并将其存储在数组中之后,我尝试使用更新表来显示数据reloadData.
用20行填充表大约需要5秒钟.奇怪的是,提取发生得非常快,因此数据可以立即获得.我不明白花了这么长时间.以下是日志中的一些信息:
2012-03-17 18:46:01.045 MakeMyApp[4571:207] numberOfSectionsInTableView: 1
2012-03-17 18:46:01.047 MakeMyApp[4571:207] numberOfRowsInSection: 0
2012-03-17 18:46:01.244 MakeMyApp[4571:1f03] numberOfSectionsInTableView: 1
2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] numberOfRowsInSection: 20
2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] Ok, I'm done. 20 objects in the array.
2012-03-17 18:46:01.246 MakeMyApp[4571:1f03] Finished XML processing.
2012-03-17 18:46:06.197 MakeMyApp[4571:1f03] cellForRowAtIndexPath:
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,它会触发两次numberOfSectionsInTableView:/ numberOfRowsInSection:两次:第一次是视图加载时,第二种是当我加载时[self.tableView reloadData];
您可以看到,在不到一秒的时间内,数组将填充20个对象,并完成处理XML的所有工作.怎么在cellForRowAtIndexPath:5秒后被解雇?
以下是可能有助于发现问题的代码的一些部分:
- (void)createRequestFromXMLElement:(TBXMLElement *)element {
// Let's extract all the information of the request
int requestId = [[TBXML valueOfAttributeNamed:@"i" forElement:element] intValue];
TBXMLElement *descriptionElement = [TBXML childElementNamed:@"d" parentElement:element];
NSString *description = [TBXML textForElement:descriptionElement];
TBXMLElement *statusElement = [TBXML childElementNamed:@"s" parentElement:element];
int status = [[TBXML textForElement:statusElement] intValue];
TBXMLElement *votesCountElement = [TBXML childElementNamed:@"v" parentElement:element];
int votesCount = [[TBXML textForElement:votesCountElement] intValue];
// Creating the Request custom object
Request *request = [[Request alloc] init];
request.requestId = requestId;
request.description = description;
request.status = status;
request.votes_count = votesCount;
[requestsArray addObject:request];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
appListCell *cell = (appListCell *)[tableView dequeueReusableCellWithIdentifier:@"appListCell"];
Request *request = [requestsArray objectAtIndex:indexPath.row];
cell.appIdLabel.text = [NSString stringWithFormat:@"#%d", request.requestId];
cell.appTextLabel.text = request.description;
cell.appVotesLabel.text = [NSString stringWithFormat:@"%d votes", request.votes_count];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
编辑:
- (void)traverseXMLAppRequests:(TBXMLElement *)element {
int requestCount = 0;
TBXMLElement *requestElement = element->firstChild;
// Do we have elements inside <re>?
if ((requestElement = (element->firstChild))) {
while (requestElement) {
[self createRequestFromXMLElement:requestElement];
requestCount++;
requestElement = [TBXML nextSiblingNamed:@"r" searchFromElement:requestElement];
}
}
[self.tableView reloadData];
NSLog(@"Ok, I'm done. %d objects in the array.", [requestsArray count]);
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我尝试获取只有1行而不是20行的信息,延迟完全相同.
Cha*_*esA 16
我知道这是一个非常古老的问题,但我刚刚遇到了同样的问题,并认为我可能知道原因.可能会帮助那些偶然发现同样问题的人......
我怀疑你的reloadData调用发生在后台线程而不是主线程上.你所描述的是这个的确切影响 - 代码运行但更新用户界面有很长的延迟(5-10秒).
尝试将reloadData呼叫更改为:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
Run Code Online (Sandbox Code Playgroud)
你正在调用reloadData除了以外的线程mainThread
确保tableView在主线程上重新加载您的数据,如下所示:
OBJ-C:
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
DispatchQueue.main.async {
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4152 次 |
| 最近记录: |