gpt4 book ai didi

ios - 单例的良好用例

转载 作者:行者123 更新时间:2023-11-28 07:50:16 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个喜欢的功能,其中显示喜欢您的个人资料的用户。因为当另一个用户喜欢他时用户会收到推送通知,我决定创建一个单例 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com