iOS
TwitterAPI
Swift
iOS9
Swift2.0

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

More than 3 years have passed since last update.


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

元ネタのリンクはこれです。

http://qiita.com/mokumoku/items/bf0460f420acac3c04fc

http://qiita.com/makora9143/items/5bdbab674bea55f56a81

しかしFebricのバージョン更新があったのか、上記のリンクのコードではdeprecate警告が出ていたので、適切な形に修正しました。


修正したコード

コード差分


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クラスを記載しておきます。


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

}
}



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