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はすごく便利っぽいのですが、公式リファレンスやサンプルコードの情報が古かったり、不十分だったりするのでまだまだハマりどころは多そうです。
日本語の情報はすごく少ないので、もっと広まって情報共有していきたいですね。
ようやくこのライブラリにも取っ掛かりができたので、もう少し触ってみようかと思います。