ios - 单例的良好用例

标签 ios swift singleton

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

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)
}

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

您有什么建议或其他建议来实现这一目标吗?

最佳答案

您确实会遇到问题。 这些东西应该在服务器端处理/存储,然后在每次需要显示类似列表时通过请求检索。 如果您真的想将它们存储在本地,单例不是可行的方法,因为每次您的应用程序退出时,您的单例都会与其中的所有内容一起消失。您应该将其存储在:

  • 一个sqlite数据库,
  • 或核心数据,
  • 或者一个 NSUserDefault

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

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

编辑: 现在我明白你的担忧了。所以是的,在单例中管理 Controller 的逻辑是一种不好的做法。如果你想按照你正在做的方式做(最后还不错,但要小心,我不会严重依赖通知来显示正确的列表,在很多情况下没有收到通知),你的单例应该只更新喜欢的列表,并通知您的 Controller 对该列表所做的任何更改。然后你的 Controller 将更新 TableView 。

因此,tableview 的所有逻辑都应该放在您的 Controller 中。您可以创建一个委托(delegate),您的 Controller 响应该委托(delegate)的协议(protocol)。

你最终会得到这样的结果:

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)
    }

}

然后您只需像这样在您的 Controller 中使用该委托(delegate):

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

关于ios - 单例的良好用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49912008/

相关文章:

iphone - 在 Resources 文件夹下添加 iOS 图标和启动图像

ios - 无法从单独的函数中解雇 UIAlertController

iphone - 单击 UIToolBarButton 选中和取消选中 UITableViewCells

ios - 单元格宽度对于表格 View 宽度来说太大

java - 我们能用java设计一个真正的单例类吗?

ios - 蓝牙流式传输在后台获取

ios - 在完成处理程序中使用类型 T 作为参数

swift - 沿路径的节点轨迹,如 hello world

iphone - Cocoa - 单例对象 : Where to initialize member variables?

php - 静态类与单例类如何工作(数据库)