読者です 読者をやめる 読者になる 読者になる

備忘録

なんとなく暇なときにでも....

RSSリーダーの実装。Part.1

お久しぶりです。
本業の方が忙しい+休日はDVDを見まくってたので、更新が止まっていました。

今回はRSSリーダーを実装をしてみましたので、その模様をお届けできればと思います。
RSSリーダーってなに?って方は、2chまとめサイトのイメージを持っていただければと思います。(間違ってたら申し訳ないです。)

Part.1ではXMLをパースして、その内容をTableViewに表示します。

import UIKit
import SwiftyJSON


class MainContentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
    
    @IBOutlet weak var tableview: UITableView!
    
    var isLoading: Bool! = false
    var cellCnt: Int!

    var mainTitle: String!
    var newsUrlString: String!
    var contentQuery: String! = ""
    
    var contentTitleArray: [String] = []
    var contentLinkArray: [String] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableview.delegate = self
        self.tableview.dataSource = self
    
        //get url
        let getQuery = self.contentQuery
        //get count
        let getCnt: Int!  = 15
        self.setUrl(getQuery, count: getCnt)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func viewWillAppear(animated: Bool) {
        self.loadUrl();
    }
    

    /* tableview */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.cellCnt 
    }
    

    //③
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = self.tableview.dequeueReusableCellWithIdentifier("contentCell", forIndexPath: indexPath)
        
        // Tag番号1で UILabel インスタンスの生成
        let title = self.tableview.viewWithTag(1) as! UILabel
        title.text = nil
        title.text = "\(self.contentTitleArray[indexPath.row])"

        let mainTitle = self.tableview.viewWithTag(2) as! UILabel
        mainTitle.text = nil
        mainTitle.text = "\(self.mainTitle)"

        return cell
    }
    
    func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
        performSegueWithIdentifier("detail", sender: self.contentLinkArray[indexPath.row])
    }
    /* tableview */
    
    
    //①
    func setUrl(query: String!, count: Int!) {
        let parseUrlString: String! = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0"
        
        self.newsUrlString = parseUrlString + "&q=" + query + "&num=" + String(count)
    }
    
    //②
    func loadUrl() {
        self.isLoading = true

        let url = NSURL(string: self.newsUrlString)!
        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error in
                let json = JSON(data: data!)
                // 各セルに情報を突っ込む

                if( json["responseStatus"] == 200){
                    // 各セルに情報を突っ込む
                    self.mainTitle = json["responseData"]["feed"]["title"].string!
                    self.cellCnt = json["responseData"]["feed"]["entries"].count
                    for i in 0..<self.cellCnt {
                        
                        if(json["responseData"]["feed"]["entries"][i]["title"] != nil){
                            self.contentTitleArray.append(json["responseData"]["feed"]["entries"][i]["title"].string!)
                        }else{
                            self.contentTitleArray.append("get error")
                        }
                        
                        if(json["responseData"]["feed"]["entries"][i]["link"] != nil){
                            self.contentLinkArray.append(json["responseData"]["feed"]["entries"][i]["link"].string!)
                        }else{
                            self.contentLinkArray.append("get error")
                        }
                    }
                    // ロードが完了したので、falseに
                    self.isLoading = false
                }else{
                    self.showAlert()
                }
        })
        task.resume()
        
        while( self.isLoading == true ) {
            usleep(10)
        }
    }
    
    //④
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "detail" {
            // get DetailController
            let detailController = segue.destinationViewController as! DetailViewController
            // set entry
            detailController.link = sender as! String
        }
    }
        
}

フローとしては、
①読み込むXMLを指定
②実際にパースした内容を取得
③Cellをインスタンス
④セルを選択したら、WebViewに遷移
という流れです。

それぞれについてもう少し詳しく見てみます。

①について
parseUrlStringですが、ここではGoogle Feed APIを使用しています。このAPIxmlJSONに変換するためのものです。JSONに変換することで取得データが扱いやすくなります。

http://www.webessentials.biz/googleapi/googeapifeed/

②について
ここでは言わずと知れたライブラリSwiftyJSONを使用して、JSONデータをより扱いやすい形にパースしています。

SwiftyJsonって便利 - Qiita

これは非常に便利でlet json = JSON(data: data!)JSON情報をパースし、

self.mainTitle = json["responseData"]["feed"]["title"].string!
self.cellCnt = json["responseData"]["feed"]["entries"].count

などで、適宜データを抽出しています。 抽出されたデータは配列に格納されます。


③について
ここに関しては割愛させていただきます。(気になる方は「テーブルビュー インスタンス化 タグ」などで検索すればよい記事がでてくるかもしれません。)
②で取得したデータを適宜表示してます。

少し早足になってしまい申し訳ないです。 また明日にでも添削しようかと思います。
それでは。

Google News APIを引っ張ってきてWebViewで表示させる