Fitter Map & Reduce trong IOS
Xin chào các bạn hôm nay thì mình sẽ hướng dẫn các bạn làm một app chat sử dụng firebase và realm
Mục đích sử dụng firebase để app chat có thể realtime , realm sẽ lưu dũ liệu lại khi bị mất kết nối với internet
Bước 1 chúng ta sử dụng cocopod để install thư viện vào project cuẩ mình
target 'GoalPost' do
use_modular_headers!
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'NVActivityIndicatorView','~> 4.0.0'
pod 'RealmSwift', '=10.1.4'
pod 'IQKeyboardManagerSwift', '6.3.0'
end
Bước 2 chúng sẽ tiến hành cấu hình project xcode với firebase các bạn có thể tham khảo tại Firebase
Bước 3 tạo ra model enity
import Foundation
import Realm
import RealmSwift
class MessageCache: Object {
@objc dynamic var _content: String = ""
@objc dynamic var _senderId: String = ""
convenience init(content:String, senderId:String) {
self.init()
self._content = content
self._senderId = senderId
}
func save() {
let realm = try! Realm()
try! realm.write {
realm.add(self)
}
}
class func all () -> Results<MessageCache> {
let realm = try! Realm()
return realm.objects(MessageCache.self)
}
func update(content:String, senderId:String) {
}
func delete() {
let realm = try! Realm()
try! realm.write{
realm.delete(self)
}
}
}
Bước 3 sau khi cấu hình xong project với firebase, chúng ta sẽ tạo ra một file riêng để thực hiện các công việc liên quan đến xác thực
import Foundation
import Firebase
class AuthService {
static let instance = AuthService()
func registerUser (withEmail email: String, andPassword password: String, userCreationComplete: @escaping (_ status: Bool, _ error: Error?) -> ()){
Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
guard let user = authResult?.user else {
userCreationComplete(false, error)
return
}
let userData = ["provider": user.providerID, "email": user.email]
DataService.instance.createDBUser(uid: user.uid, userData: userData as Dictionary<String, Any>)
userCreationComplete(true, nil)
}
}
func loginUser(withEmail email: String, andPassword password: String, loginComplete: @escaping (_ status: Bool, _ error: Error?) -> ()) {
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
if error != nil {
loginComplete(false, error)
return
}
loginComplete(true, nil)
}
}
}
Một file riêng liên thao tác với việc lấy data
import Foundation
import Firebase
let DB_BASE = Database.database().reference()
class DataService {
static let instance = DataService()
private var _REF_BASE = DB_BASE
private var _REF_USERS = DB_BASE.child("users")
var REF_FEED: DatabaseReference {
return _REF_FEED
}
func createDBUser(uid: String, userData: Dictionary<String, Any>) {
REF_USERS.child(uid).updateChildValues(userData)
}
func getUsername(forUID uid: String, handler: @escaping (_ username: String) -> ()) {
REF_USERS.observeSingleEvent(of: .value) { (userSnapshot) in
guard let userSnapshot = userSnapshot.children.allObjects as? [DataSnapshot] else { return }
for user in userSnapshot {
if user.key == uid {
handler(user.childSnapshot(forPath: "email").value as! String)
}
}
}
}
func uploadPost(withMessage message: String, forUID uid: String, withGroupKey groupKey: String?, sendComplete: @escaping (_ status: Bool) -> ()) {
if groupKey != nil {
REF_GROUPS.child(groupKey!).child("messages").childByAutoId().updateChildValues(["content": message, "senderId": uid])
sendComplete(true)
} else {
REF_FEED.childByAutoId().updateChildValues(["content": message, "senderId": uid])
sendComplete(true)
}
}
func getAllFeedMessages(handler: @escaping (_ messages: [MessageCache]) -> ()) {
var messageArray = [MessageCache]()
REF_FEED.observe(.value) { (feedMessageSnapshot) in
// observeSingleEvent(of: .value) { (feedMessageSnapshot) in
guard let feedMessageSnapshot = feedMessageSnapshot.children.allObjects as? [DataSnapshot] else { return }
for message in feedMessageSnapshot {
let content = message.childSnapshot(forPath: "content").value as? String
let senderId = message.childSnapshot(forPath: "senderId").value as? String
// let message = Message(content: content ?? "", senderId: senderId ?? "")
let message = MessageCache(content: content ?? "", senderId: senderId ?? "")
messageArray.append(message)
}
handler(messageArray)
}
}
}
Core data build modle trong Xcode để tạo ra class đươc sử dụng để tạo ra dữ liệu object
Realm kế thừa từ Object và đánh giấu các thuộc tính bạn muốn lưu dynamic