FebricでTwitterのタイムラインを表示する（Xcode7.2版）

# FabricでTwitterのタイムラインを表示する

元ネタのリンクはこれです。
http://qiita.com/mokumoku/items/bf0460f420acac3c04fc
http://qiita.com/makora9143/items/5bdbab674bea55f56a81
しかしFebricのバージョン更新があったのか、上記のリンクのコードではdeprecate警告が出ていたので、適切な形に修正しました。

## 修正したコード

コード差分

```swift:TwitterAPI.swift

-  class func getHomeTimeline(tweets: [TWTRTweet]->(), error: (NSError) -> ()) {
+  class func getHomeTimeline(user: String?, tweets: [TWTRTweet]->(), error: (NSError) -> ()) {
     let api = TwitterAPI()
+    let client = TWTRAPIClient(userID: user)
     var clientError: NSError?
     let path = "/statuses/home_timeline.json"
     let endpoint = api.baseURL + api.version + path
-    let request:NSURLRequest? = Twitter.sharedInstance().APIClient.URLRequestWithMethod("GET", URL: endpoint, parameters: nil, error: &clientError)
+    let request:NSURLRequest? = client.URLRequestWithMethod("GET",
+      URL: endpoint,
+      parameters: nil,
+      error: &clientError)

     if request != nil {
-      Twitter.sharedInstance().APIClient.sendTwitterRequest(request!, completion: {
+      client.sendTwitterRequest(request!, completion: {
         response, data, err in
         if err == nil {
           let json: AnyObject? =  try! NSJSONSerialization.JSONObjectWithData(data!,
```

Twitterクラスのメンバの一部がdeprecateされるようなので、代わりにTWTRAPIClientクラスを使用します。
ここで、loginした際に返されるTWTRSession情報からuserIdを渡しておきます。

サンプルとしてカスタムしたLoginViewControllerクラスと TimelineViewControllerクラスを記載しておきます。

```swift:LoginViewController.swift
import UIKit
import TwitterKit


class LoginViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    /*
    let logInButton = TWTRLogInButton { (session, error) in
      if session != nil {
        //self.performSegueWithIdentifier("main", sender: session!.userName)
        self.performSegueWithIdentifier("timeline", sender: session!.userName)
      } else {
        NSLog("Login error: %@", error!.localizedDescription);
      }
    }
    
    // TODO: Change where the log in button is positioned in your view
    logInButton.center = self.view.center
    self.view.addSubview(logInButton)*/
    
    
    Twitter.sharedInstance().logInWithCompletion { session, error in
      if (session != nil) {
        print("signed in as \(session!.userName)");
        self.performSegueWithIdentifier("timeline", sender: session)
      } else {
        print("error: \(error!.localizedDescription)");
      }
    }

  }
  
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let session = sender as? TWTRSession
    let dest = segue.destinationViewController as! TimelineViewController
    dest.title = session!.userName
    dest.userId = session?.userID
    
  }
}

```

```swift:TimelineViewController.swift
import UIKit
import TwitterKit

class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
  var tableView: UITableView!
  var tweets: [TWTRTweet] = [] {
    didSet {
      tableView.reloadData()
    }
  }
  var prototypeCell: TWTRTweetTableViewCell?
  
  var userId: String?
  
  override func viewDidLoad() {
    super.viewDidLoad()
    tableView = UITableView(frame: self.view.bounds)
    tableView.delegate = self
    tableView.dataSource = self
    
    prototypeCell = TWTRTweetTableViewCell(style: .Default, reuseIdentifier: "cell")
    
    tableView.registerClass(TWTRTweetTableViewCell.self, forCellReuseIdentifier: "cell")
    self.view.addSubview(tableView)
    
    loadTweets()
  }
  
  func loadTweets() {
    TwitterAPI.getHomeTimeline(userId,tweets: {
      twttrs in
      for tweet in twttrs {
        self.tweets.append(tweet)
      }
      }, error: {
        error in
        print(error.localizedDescription)
    })
  }
  
  // MARK: UITableViewDataSource
  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of Tweets.
    return tweets.count
  }
  
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TWTRTweetTableViewCell
    
    let tweet = tweets[indexPath.row]
    cell.configureWithTweet(tweet)
    
    return cell
  }
  
  // MARK: UITableViewDelegate
  func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let tweet = tweets[indexPath.row]
    
    prototypeCell?.configureWithTweet(tweet)
    
    let height = TWTRTweetTableViewCell.heightForTweet(tweet, width: self.view.bounds.width)
    if !height.isNaN {
      return height
    } else {
      return tableView.estimatedRowHeight
    }
  }
}
```

## 最後に

Febricはすごく便利っぽいのですが、公式リファレンスやサンプルコードの情報が古かったり、不十分だったりするのでまだまだハマりどころは多そうです。
日本語の情報はすごく少ないので、もっと広まって情報共有していきたいですね。

ようやくこのライブラリにも取っ掛かりができたので、もう少し触ってみようかと思います。

## Thanks

http://qiita.com/mokumoku
http://qiita.com/makora9143