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