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

Written on