2016-08-31 56 views
0

我試圖從rss提要檢索XML,獲取每篇文章的鏈接,然後從這些文章中提取信息。我使用AEXML獲取xml,並使用ReadabilityKit進行鏈接提取。Async調用中的異步調用未執行

我已成功從XML拉出鏈接,但Readability上的解析器調用從不執行。我不想在主線程中使用它,因爲它阻止了所有UI,但到目前爲止,這是我使它工作的唯一方法。代碼如下(刪除了調度得到主隊列):

func retrieveXML() { 
    let request = NSURLRequest(URL: NSURL(string: "<XML URL HERE>")!) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     (data, response, error) in 

     if data == nil { 
      print("\n\ndataTaskWithRequest error: \(error)") 
      return 
     } 

     do { 
      let xmlDoc = try AEXMLDocument(xmlData: data!) 
      for child in xmlDoc.root.children { 

       if let postURL = child["id"].value { 

        let url = NSURL(string: postURL) 
        let parser = Readability(url: url!) 
        let title = parser.title() 
        print("TITLE: \(title)") 
       } 
      } 
     } catch { 
      print(error) 
     } 
    } 
    task.resume() 
} 
+0

您是否試過這個? 'DispatchQueue.main.async { 設URL = NSURL(字符串:postURL) 讓解析器=可讀性(網址:網址!) 讓標題= parser.title() 打印( 「TITLE:\(標題)」) }' – heikomania

+0

@heikomania不編譯= /。但是,如果我在主隊列中放置了「解析器=可讀性...」行,它會阻止我不想要的用戶界面。 – kerbelda

+0

是的,這就是Swift 3並調度到主隊列,但這個概念是正確的:'Readability'是死鎖的,所以你必須將它異步分派到另一個隊列。但是,我同意,你不應該爲此使用主隊列。當然,如果你使用的是Swift 2,那麼使用Swift 2語法。 – Rob

回答

0

的問題是,Readability被死鎖。您從NSURLSession完成塊(默認爲一個串行隊列)調用它,但是Readability塊會使用信號隊列排隊,直到它自己的網絡請求完成。所以Readability是死鎖,因爲它阻止了一個線程等待一個信號量信號,該信號應該從它阻塞的同一個線程發送。

您可以通過將實例化Readability的代碼異步分派到單獨的隊列(例如全局隊列)來修復此問題。

dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) { 
    let url = NSURL(string: postURL) 
    let parser = Readability(url: url!) 
    let title = parser.title() 
    print("TITLE: \(title)") 
} 

它看起來像API已更新爲異步運行,所以得到的最新版本和死鎖問題被消除,將不再需要上述異步分派。您顯然必須使用更新的API的完成處理程序模式。

1

感謝您報告。新版本在可可豆莢中提供,並帶有新的aync API。同步API將從項目中刪除。

Readability.parse(url: articleUrl, { data in 
    let title = data?.title 
    let description = data?.description 
    let keywords = data?.keywords 
    let imageUrl = data?.topImage 
    let videoUrl = data?.topVideo 
}) 

感謝您的貢獻!欲瞭解更多信息,請查閱自述文件https://github.com/exyte/ReadabilityKit