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];
});

将其他代码放在主线程之外。