XML 解析器阻塞主线程和 dispatch_async 崩溃应用
XML Parser blocking main thread and dispatch_async crashing app
我正在开发一个应用程序,在这个应用程序中,我在 uitable 视图中加载 xml 数据,并且 table 视图每 5 次调用解析方法秒并重新加载 uitable 以加载新数据。一切正常,但应用程序在 5 秒后开始解析时卡住了,所以我决定在解析方法中实现 dispatch_async,但之后应用程序崩溃,就像 5 秒后每当应用程序重新加载 uitable .这是我的代码。
- (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 = @"";
}
我得到的错误是:
打印你的数组。检查两次。我认为你得到的是一个空数组。在控制台中打印从服务器获取并解析的每个对象。这样你就明白了。
更新:
只需在主线程上重新加载 table 数据,不要解析主线程上的数据。喜欢:
dispatch_async(dispatch_get_main_queue(), ^{
[messageList reloadData];
});
将其他代码放在主线程之外。
我正在开发一个应用程序,在这个应用程序中,我在 uitable 视图中加载 xml 数据,并且 table 视图每 5 次调用解析方法秒并重新加载 uitable 以加载新数据。一切正常,但应用程序在 5 秒后开始解析时卡住了,所以我决定在解析方法中实现 dispatch_async,但之后应用程序崩溃,就像 5 秒后每当应用程序重新加载 uitable .这是我的代码。
- (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 = @"";
}
我得到的错误是:
打印你的数组。检查两次。我认为你得到的是一个空数组。在控制台中打印从服务器获取并解析的每个对象。这样你就明白了。
更新:
只需在主线程上重新加载 table 数据,不要解析主线程上的数据。喜欢:
dispatch_async(dispatch_get_main_queue(), ^{
[messageList reloadData];
});
将其他代码放在主线程之外。