2013-11-15 24 views
0

我有一個XML解析器,當它開始它使整個應用程序凍結,直到它完成,我打電話使用的解析器:XML解析器阻止主線程

xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"]; 

什麼是擁有最好的辦法XML解析器在不中斷主線程的情況下工作? 我想知道如果使用其他線程是最好的選擇,或使用別的東西。

回答

1

如果你打算使用initWithContentsOfURL,那麼你絕對應該從主線程開始工作,然後在獲得初始化結果後再回到主線程。

根據您的文檔的大小,你會發現它更好地使用NSURLConnection,該做的工作,而不會阻塞主線程,然後調用[XMLParser initWithData]一旦你的數據首先獲取URL的內容NSData 。這具有額外的好處,您可以實際處理與XML錯誤分開的網絡錯誤。

1

嘗試使用GCD爲你做這個操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update UI 
    }); 
}); 

上一個新的輸入隊列dispatch_async,在這一塊做的所有旅遊網絡操作,那麼/ XML解析創建另一個dispatch_async此時主隊列所以你可以更新UI元素或回調完成/失敗