【问题标题】:iOS private/public data management and storage in SwiftSwift 中的 iOS 私有/公共数据管理和存储
【发布时间】: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

   }
}

【问题讨论】:

    标签: ios swift networking core-data


    【解决方案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 视图。我说的对吗?
    • 非常感谢这个例子。我真的会帮我创建这个混合数据模型
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2011-12-27
    • 2014-11-21
    • 2021-01-06
    • 2012-11-10
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多