我正在开发一个应用程序,在此应用程序中,我将XML数据加载到uitableview中,并且该表视图每隔5秒就会调用解析方法并重新加载uitable以加载新数据。一切工作正常,但5秒钟后开始解析时应用卡住了,所以我决定在解析方法中实现dispatch_async,但是此应用崩溃后,只要5秒钟后就可以重新加载应用了。这是我的代码。
- (void) Parse{
previusCount = rssOutputData.count;
rssOutputData = [[NSMutableArray alloc]init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *post =[[NSString alloc] initWithFormat:@"https://messages_%@.xml",[[NSUserDefaults standardUserDefaults] stringForKey:@"xmls_id"]];
NSData *xmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:post]];
xmlParserObject =[[NSXMLParser alloc]initWithData:xmlData];
[xmlParserObject setDelegate:self];
dispatch_async(dispatch_get_main_queue(), ^{
[xmlParserObject parse];
[messageList reloadData];
if (previusCount != rssOutputData.count) {
NSInteger bottomRow = [rssOutputData count] - 1; // this is your count's array.
if (bottomRow >= 0) {
///////getting to latest msg/////////////
NSIndexPath *indexPathnew = [NSIndexPath indexPathForRow:bottomRow inSection:0];
[self.messageList scrollToRowAtIndexPath:indexPathnew atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
});
});
}
我将消息发送到xml数据文件的方法。
- (IBAction)sendClicked:(id)sender {
[messageText resignFirstResponder];
if ( [messageText.text length] > 0 ) {
NSString *rawStr;
if ([[NSUserDefaults standardUserDefaults] integerForKey:@"userType"] == 1) {
rawStr = [NSString stringWithFormat:@"data=%@&user_id=%@&session_id=%@", messageText.text, [[NSUserDefaults standardUserDefaults] stringForKey:@"therapist_id"],[[NSUserDefaults standardUserDefaults] stringForKey:@"xmls_id"]];
} else{//////In case of Patient
rawStr = [NSString stringWithFormat:@"data=%@&user_id=%@&session_id=%@", messageText.text, [[NSUserDefaults standardUserDefaults] stringForKey:@"patient_id"],[[NSUserDefaults standardUserDefaults] stringForKey:@"xmls_id"]];
}
NSData *data = [rawStr dataUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"http://do_add_message.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:data];
NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSLog(@"responseData: %@", responseData);
//////////////////////
[self Parse];
}
messageText.text = @"";
}
打印您的数组。检查两次。我认为您得到的是一个空数组。在控制台中打印从服务器获取并解析的每个对象。这样您就会有主意。
更新:
只需在主线程上重新加载表数据,而不在其上解析数据。喜欢:
dispatch_async(dispatch_get_main_queue(), ^{
[messageList reloadData];
});
将其他代码放在主线程之外。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句