如何避免以正确的方式使用单身?

时间:2017-04-26 11:00:52

标签: ios swift design-patterns

我想重构我的代码以应用干净的方法。

我有一个班级user

class User { 
    let name: String?
    let id: String
    var isOnline: Bool

    var mesaageHistory = [Message]()

    init(name: String, id: String, isOnlineStatus: Bool) {
        self.name = name
        self.id  = id
        self.isOnline = isOnlineStatus
    }

}

然后我使用Fabric模式创建我的用户列表。

protocol CreateUserProtocol: class {
    func sortArray(inputArr: [User])
}


class CreateUserEntity: CreateUserProtocol {

    static let shared = CreateUserEntity()
    var users = [User]()

    func sortArray(inputArr: [User]){
        var applySortingByDate: Bool = false

        for user in inputArr {
            if !user.mesaageHistory.isEmpty {
                applySortingByDate = true
            }
        }

        if applySortingByDate {
            inputArr.sorted(by: { (first, second) -> Bool in
                (first.mesaageHistory.last?.messageTime)! < (second.mesaageHistory.last?.messageTime)!
            })
        } else {
            inputArr.sorted(by: { (first, second) -> Bool in
                first.name! < second.name!
            })
        }
    }

}

一个控制器负责追加新用户,而另一个控制器用于检索它们并将它们绑定到tableView。一切都运行正常,但我认为我的解决方案不足以扩展。

此外,在我的一个VC中,我用来对用户进行在线和离线排序。我想,我不应该在我的VC中这样做并将这个逻辑放入我的CreateUserEntity

var onlineUsersData = [User]()
var offlineUsersData = [User]()

private func classifyUsers() {
    for user in CreateUserEntity.shared.users {

        print("is user online: \(user.isOnline)")
        print(CreateUserEntity.shared.users.count)

        if user.isOnline == true && !onlineUsersData.contains(user) {
            onlineUsersData.append(user)
        }

        if user.isOnline == false && !offlineUsersData.contains(user) {
            offlineUsersData.append(user)
        }
    }
}

我想以适当的方式重写它,你能推荐我什么?

1 个答案:

答案 0 :(得分:0)

从我的观点来看,首先尝试使用struct而不是class

示例:

struct User {
    let name: String
}

然后你应该弄清楚你将存储这些用户的位置?现在他们在记忆中。所以我们应该定义存储它们的位置和方式。

因此,对于这种情况,我们可以将NSUserDefaults视为存储用户的类的核心。之后我们应该为此类创建外观来管理我们的用户。

protocol UserStoreFacade {
    func fetch(name withName:String) -> User
    func create(name withName:String) -> User
    func save(user:User)
    func update(name newName:String) -> User
    func delete(name withName:String)
}

用于管理用户的UserStore

class UserStore: UserStoreFacade {

    let defaults = UserDefaults(suiteName: "User")

    func fetch(name withName:String) -> User {
         let encodeData = defaults?.dictionary(forKey: withName)
         return User(dictionary: encodeData as! Dictionary<String, AnyObject>)
    }

    func create(name withName: String) -> User {
        return User(name: withName)
    }

    func save(user: User) {
        defaults?.set(user.encode(), forKey: user.name)
    }

    func update(name newName:String) -> User {
        return User(name: newName)
    }

    func delete(name withName:String) {
         defaults?.removeObject(forKey: withName)
    }
}

这是非常原始的,但仍然显示了如何才能实现。