2016-04-29 51 views
0

我在uitable視圖解析XML數據的時候,這裏使用dispatch_async是我的代碼:dispatch_async與XML解析器不工作

- (void) Parse{ 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    NSString *post =[[NSString alloc] initWithFormat:@"http://messages.xml"]; 
    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]; 
} 

現在的UITableView不顯示任何數據。它在dispatch_async之前工作完美

+0

你打電話'[給messageManager reloadData]'後的數據獲取情況不會發生,它的第一個發出後立即發生。請記住,當你分派時,主線程上的代碼執行會立即繼續執行下一條語句'reloadData'。 – dirkgroten

回答

1

我覺得你的代碼有問題。請重新加載表數據dispatch_get_main_queue()

- (void) Parse { 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

     NSString *post =[[NSString alloc] initWithFormat:@"http://messages.xml"]; 
     NSData *xmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:post]]; 
     xmlParserObject =[[NSXMLParser alloc]initWithData:xmlData]; 
     [xmlParserObject setDelegate:self]; 
     [xmlParserObject parse]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [messageList reloadData]; 
     }); 
    });  
} 
+1

爲什麼在主線程上解析xml?我將移動'[xmlParserObject parse];'調用dispatch_async(dispatch_get_main_queue()')之上的行,以便它在後臺運行。只需要在主線程上調用reloadData。 –

+0

只提供重載代碼在dispatch_get_main_queue()和其他代碼中你想要的不會發出 – iMHitesh

+0

「只把重載代碼放到dispatch_get_main_queue()和其他你想要的地方不會發出問題的代碼。」這不是一句話。把XML在解析XML時,解析主線程中的代碼會導致UI凍結,如果XML很大,可能會導致很長的UI凍結,甚至可能導致系統以無響應方式終止應用程序。沒關係** –