Swift 中的 iOS 私有/公共数据管理和存储

Posted

技术标签:

【中文标题】Swift 中的 iOS 私有/公共数据管理和存储【英文标题】:iOS private/public data management and storage in Swift 【发布时间】:2020-02-14 20:39:06 【问题描述】:

是否可以显示为从网络和相同模型检索但从核心数据检索的一个数组对象。目的是让相同的数据可能是公共的(然后从网络中检索)或私有的,然后这些数据本地存储在 coredata 模型中。两者的属性/属性将相同。

我打算将其显示为 swiftUI 视图(如果重要的话)

经过一番搜索,我想到了一个结构,该结构基于其隐私属性将被转换为核心数据类模型,或者如果公共直接连接到网络层?

例如(一些伪 swift ;))

struct Note 
   let note: String
   let isPrivate: Bool

   func save(self) 
       if self.isPrivate  save to CoreData 
       else  send save request with use of networking 
   


class coreDataModel: NSManagedObject 
   var note: String
   let isPrivate = true


struct networkingModel 
   var note: String
   let isPrivate = false


class modelManager 
   func joinData() 
       let joinedModel: Note = coreDataModel + networkingModel 
    // and so on to display that model

   

【问题讨论】:

【参考方案1】:

我想你可以试试这个,首先用现有的本地数据加载 ui。同时,在后台队列中调用您的 api。一旦 api 结果可用,过滤重复项,然后将其保存在本地。然后最后一步是通知ui重新加载。

这个伪代码有点特定于 UIKit,但是在 SwiftUI 中可以应用相同的逻辑。您不需要关闭,您将直接计算您的发布者对象,并且 ui 将根据任何新的发射做出反应。

/// you can have one model for both api and core data 
struct Note: Hashable  let uuid = UUID.init() 

class ModelManager 
    private var _items: Array<Note> = []

    var onChanged: ((Array<Note>) -> Void)? = nil
    // you might also have an init, where you can have a timer running
    func start() 
        loadFromCoreData  [weak self] (items) in
            guard let `self` = self else  return 
            self._items.append(contentsOf: items)
            self.onChanged?(self._items)
            self.loadFromApi()
        
    

    private func loadFromCoreData(completion: @escaping (Array<Note>) -> Void) 
        // background queue
        // logic to load from coredata.
        let coreDataResults: Array<Note> = []
        completion(coreDataResults)
    

    private func loadFromApi() 
        // background queue
        let apiResults: Array<Note> = []
        compute(contents: apiResults)
    

    private func compute(contents: Array<Note>) 
        let combined = zip(_items, contents).flatMap[$0.0, $0.1] 
        let newItems = Array(Set(combined)) // set doesn't allow duplicates 
        // save to db

        // insert to new to _items
        _items.append(contentsOf: newItems)
        // sort maybe to place new items on top
        self.onChanged?(self._items)

    





// usage of this object 
    let manager = ModelManager()
    manager.start()
    manager.onChanged =  items in
        // [weak self] remember of retain cycles
        // make sure you are on main queue when reloading

    

【讨论】:

我能正确阅读吗?您建议将公共模型本地存储在与私有模型相同的核心数据模型中,然后将整体显示为“本地”数据? _items 不是这里的核心数据模型,是吗?我之所以问是因为compute(...) 方法中的// save to db 评论。如果我缓存 api 响应,我认为我不需要在本地存储远程数据。 Note 可以是任何你喜欢的东西,只要你符合所需的协议。 是的,我很清楚。我只是想确保您定义为私有的 _items 也可以是一个公共属性,例如,我可以将其作为 ObservableObject 属性发布到 SwiftUI 视图。我说的对吗? 非常感谢这个例子。我真的会帮我创建这个混合数据模型

以上是关于Swift 中的 iOS 私有/公共数据管理和存储的主要内容,如果未能解决你的问题,请参考以下文章

用于存储简单数据的“公共静态”和“私有静态”之间的区别。啥是更好的? [复制]

text 存储中的私有映像文件,非公共映像

无视频输出和 [MC] 从公共有效用户设置中读取。 Swift/iOS 11 中的错误

Firebase 存储安全规则,允许公共或所有者私有文件访问

列出具有公共读取权限的 S3 对象(在私有存储桶中)

Jupyter Notebook ipynb 中的图像未显示在 GitHub 私有存储库中,但相同的代码适用于公共存储库