2014-10-30 23 views
0

嗨,我想嘗試一個簡單的練習。我做了這個基本的XML閱讀器,它工作正常,但我很想改善它,並擔心異步加載。我應該怎麼做?swift xml rss reader ...讓它異步

import UIKit 

class ViewController: UITableViewController, NSXMLParserDelegate, UITableViewDelegate { 



    let urlstring = "http://www.nasa.gov/rss/dyn/breaking_news.rss" 
    var element:NSString = "" 
    var items:[String] = [] 
    var item = "" 


    override func viewDidLoad() { 
     super.viewDidLoad() 

    // dispatch_queue_t myQueue = dispatch_queue_create("queue",NULL) 

     loadParser() 
    } 

    //MARK - tableviewdelegate 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return items.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     cell.textLabel.text = items[indexPath.row] 

     return cell 
    } 

    //MARK - parser 

    func loadParser(){ 
     let url = NSURL(string: urlstring) 
     var parser = NSXMLParser(contentsOfURL: url) 
     parser?.delegate = self 
     parser?.shouldProcessNamespaces = true 
     parser?.shouldReportNamespacePrefixes = true 
     parser?.shouldResolveExternalEntities = true 
     parser?.parse() 
    } 



    //MARK: - Parser Delegate 

    func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) { 

     element = elementName 
     if ((elementName as NSString).isEqualToString("item")){ 
      item = "" 
     } 

    } 


    func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { 

     if ((elementName as NSString).isEqualToString("item")){ 
      items.append(item) 
     } 
    } 


    func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
     if ((element.isEqualToString("title")) && (element != "")){ 
      item += string 
     } 
    } 



    func parserDidEndDocument(parser: NSXMLParser!) { 
     println(items) 
     self.tableView.reloadData() 
    } 


} 

我不知道該怎麼做。我試圖將「loadParser」包裝在一個調度隊列中,但在swift中它不起作用。你們可以告訴我如何使用GCD來做到這一點嗎?感謝

+0

你是什麼意思不工作?你嘗試了什麼?結果是什麼? – Abizern 2014-10-30 19:46:11

回答

0

什麼:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    loadParser(); 
}); 

這應該是一樣的原始Objective-C的解決方案

+0

如果我在我的項目中插入代碼,應用程序崩潰:((( – Marco 2014-10-30 19:40:44

1

給大家還在尋找解決方案,這裏是我用這個工作得很好,使代碼此代碼我用SWXMLHash

爲了讓你不得不使用SWXMLHash最好的方法,使XML解析異步

此代碼的工作

解決這個問題使用雨燕2.0

// test.swift 
// Test Ground 
// 
// Created by O-mkar on 14/12/15. 
// Copyright © 2015 Test Ground. All rights reserved. 
// 

import UIKit 
import SWXMLHash //import SWXML Class 

class test: UITableViewController { //Change this test to your name 



    let urlstring = "http://www.nasa.gov/rss/dyn/breaking_news.rss" 
    var items:[String] = [] 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     loadParser() 
    } 


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return items.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     cell.textLabel!.text = items[indexPath.row] 

     return cell 
    } 

    //MARK - parser 

    func loadParser(){ 

     let request = NSMutableURLRequest(URL: NSURL(string: urlstring)!) 
     let session = NSURLSession.sharedSession() 
     request.HTTPMethod = "GET" 

     var err: NSError? 

     let task = session.dataTaskWithRequest(request) { 
      (data, response, error) in 

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

      func pars(){ 
       let xml = SWXMLHash.parse(data!) 

       for elem in xml["rss"]["channel"]["item"] { 

        self.items.append((elem["title"].element?.text)!) 

       } 

       //reload data after fetch 
       self.tableView.reloadData() 


      } 
      //sending async task 
      dispatch_async(dispatch_get_main_queue(), pars) 


     } 
     task.resume() 

    } 


} 

輸出

OUTPUT

代碼,我用來做IT異步

let request = NSMutableURLRequest(URL: NSURL(string: urlstring)!) 
     let session = NSURLSession.sharedSession() 
     request.HTTPMethod = "GET" 

     var err: NSError? 

     let task = session.dataTaskWithRequest(request) { 
      (data, response, error) in 

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

      func pars(){ 
       let xml = SWXMLHash.parse(data!) 

       for elem in xml["rss"]["channel"]["item"] { 

        self.items.append((elem["title"].element?.text)!) 

       } 

       //reload data after fetch 
       self.tableView.reloadData() 


      } 
      //sending async task 
      dispatch_async(dispatch_get_main_queue(), pars) 


     } 
     task.resume()