User.swift
import UIKit
class User :NSObject {
var objectId: String
var userName: String
var displayName: String?
var introduction: String
init(objectId: String, userName: String) {
self.objectId = objectId
self.userName = userName
}
}
Post.swift
import UIKit
class Post :NSObject{
var objectId : String
var user: User
var imageUrl: String
var text: String
var createDate: Date
var isLiked: Bool?
var comment: [Comment]?
var likeCount: Int = 0
init(objectId: String, user: User, imageUrl: String, text: String, createDate: Date) {
self.objectId = objectId
self.user = user
self.imageUrl = imageUrl
self.text = text
self.createDate = createDate
}
}
ViewController.swift
func loadTimeline() {
let query = NCMBQuery(className: "Post")
guard let currentUser = NCMBUser.current() else {
//guard文を使うとcurrentUserがnilだった時にログイン画面に戻る
let storyboard = UIStoryboard(name: "SignIn", bundle: Bundle.main)
let rootViewController = storyboard.instantiateViewController(identifier: "SignInNavigationController")
UIApplication.shared.keyWindow?.rootViewController = rootViewController
let ud = UserDefaults.standard
ud.set(false, forKey: "isLogin")
ud.synchronize()
return
}
// 降順
query?.order(byDescending: "createDate")
// 投稿したユーザーの情報も同時取得
query?.includeKey("user")
// フォロー中の人 + 自分の投稿だけ持ってくる
// query?.whereKey("user", containedIn: followings)
// オブジェクトの取得
query?.findObjectsInBackground({ (result, error) in
if error != nil {
SVProgressHUD.showError(withStatus: error!.localizedDescription)
} else {
// 投稿を格納しておく配列を初期化(これをしないとreload時にappendで二重に追加されてしまう)
self.posts = [Post]()
for postObject in result as! [NCMBObject] {
// ユーザー情報をUserクラスにセット
let user = postObject.object(forKey: "user") as! NCMBUser
// 退会済みユーザーの投稿を避けるため、activeがfalse以外のモノだけを表示
if user.object(forKey: "active") as? Bool != false {
// 投稿したユーザーの情報をUserモデルにまとめる
let userModel = User(objectId: user.objectId, userName: user.userName)
userModel.displayName = user.object(forKey: "displayName") as? String
// 投稿の情報を取得
let imageUrl = postObject.object(forKey: "imageUrl") as! String
let text = postObject.object(forKey: "text") as! String
// 2つのデータ(投稿情報と誰が投稿したか?)を合わせてPostクラスにセット
let post = Post(objectId: postObject.objectId, user: userModel, imageUrl: imageUrl, text: text, createDate: postObject.createDate)
// likeの状況(自分が過去にLikeしているか?)によってデータを挿入
let likeUsers = postObject.object(forKey: "likeUser") as? [String]
if likeUsers?.contains(currentUser.objectId) == true {
post.isLiked = true
} else {
post.isLiked = false
}
// いいねの件数
if let likes = likeUsers {
post.likeCount = likes.count
}
// 配列に加える
self.posts.append(post)
}
}
// 投稿のデータが揃ったらTableViewをリロード
self.timeLineTableView.reloadData()
}
})
}