单身人士

时间:2018-04-19 02:57:32

标签: ios swift singleton

在我的应用中,我有一个类似功能,其中显示的用户喜欢您的个人资料。因为当其他用户喜欢他时,用户会收到推送通知,所以我决定创建一个单身ENFeedLikeManager来存储我喜欢的数组,并在收到通知时添加对象:

ENFeedLikeManager.swift

let ENFeedLikeInstance = ENFeedLikeManager.sharedInstance

class ENFeedLikeManager: NSObject {

    var likeViewController: ENLikeViewController?
    var likes = [ENFeedLike]()

    static let sharedInstance = ENFeedLikeManager()

    override init() {
        super.init()
    }

    func addNotificationLike(like: ENFeedLike) {

        guard let likeViewController = likeViewController else {
            return
        }

        likes.insert(like, at: 0)
        likeViewController.likeTableView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic)
    }

}

当应用程序启动时,我从服务器获取相似的数据,然后将结果存储在ENFeedLikeInstance.likes中,我将从此数组中进行操作,以进一步操作,例如显示tableView ...

AppDelegate.swift(application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)当它是一个新的通知时)

let newLikeData = parseLikeNotification(notification: dataDict)
if let user = newLikeData {
    ENFeedLikeInstance.addNotificationLike(like: user)
}

我担心通过使用这种单身,我有一些去初始化的问题。

你有什么建议可以做到吗?

1 个答案:

答案 0 :(得分:0)

你确实会遇到问题。 应该在服务器端处理/存储这些类型的东西,然后每次需要显示类似的列表时通过请求检索。 如果你真的想在本地存储它们,那么就不能使用单例,因为每次你的应用程序退出时,你的单例都会随着其中的一切而消失。你应该把它存储在:

  • 一个sqlite数据库,
  • 或coredata,
  • 或NSUserDefault

如果你真的想使用单身人士,那么你需要在每次初始化时发出请求以从服务器中获取喜欢的列表。

注意: 如果您选择在本地存储数据,则可能会出现问题,特别是对于可能经常更改的类似列表,您最终可能会得到一个不是最新的列表。

编辑: 现在我理解你的担忧。所以,在单身人士中管理控制器的逻辑是不好的做法。如果你想按照自己的方式行事(最后并没有那么糟糕,但要小心,我不会在很大程度上依赖通知来显示正确的列表,他们很多情况下都没有收到通知),你的单身人士应该只保持更新类似的列表,并通知您的控制器有关该列表所做的任何更改。然后你的控制器将更新tableview。

所以tableview的所有逻辑都应该放在你的控制器中。您可以创建一个委托,您的控制器将响应该委托的协议。

你最终会得到类似的东西:

let ENFeedLikeInstance = ENFeedLikeManager.sharedInstance

protocol ENFeedLikeManagerDelegate: class {
    func didUpdateLikeList(_ list: [ENFeedLike])
}

class ENFeedLikeManager: NSObject {

    weak var delegate: ENFeedLikeManagerDelegate?
    var likes = [ENFeedLike]() {
       didSet {
            delegate?. didUpdateLikeList(likes)
       }
    }

    static let sharedInstance = ENFeedLikeManager()

    override init() {
        super.init()
    }

    func addNotificationLike(like: ENFeedLike) {

        guard let likeViewController = likeViewController else {
            return
        }

        likes.insert(like, at: 0)
    }

}

然后你只需要在你的控制器中使用那个委托:

extension yourViewController: ENFeedLikeManagerDelegate {
     func didUpdateLikeList(_ list: [ENFeedLike]) {
          // update your tableview here with the new list of like
      }
}