gpt4 book ai didi

ios - 使用 Swift 3 的核心数据指南

转载 作者:行者123 更新时间:2023-11-28 06:27:33 24 4
gpt4 key购买 nike

不是在寻找代码(虽然不会造成伤害)只是想知道我应该如何去做。我有一个类似于博客阅读器的应用程序。我在 MYSQL 数据库中有信息,这些信息是用 JSON 获取的,放在 jsonArray 中,然后放在一个数组中以显示在 TableView 中。在该 TableView 中,我通常将所有对象都放在 1 个部分中。每行/对象都有一个按钮,单击它会将那行移动到另一个部分。我还有一个搜索 Controller 来搜索主要部分(第 1 部分)。

如何将行的顺序或位置保存到 Core Data?

例如:我在第 0 节中有 0 行,在第 1 节中有 5 行,我单击第 1 节中其中一行上的按钮,它将该行移动到第 0 节,现在第 0 节有 1 行,而第 1 节有 4 行。如何将这个新的 tableview 订单保存到 Core Data?我只想保存行位置,以便应用记住所选行所在的部分。

我是否保存该部分中行的索引路径?添加实体和属性时,用什么保存?

此外,它是一个 mysql 阅读器,因此当重新加载 tableview 并添加新内容时,它是否仍会显示,因为 tableview 将从核心数据读取?

我正在学习 Core Data(Swift 3 代码),但在将它用于此应用程序时遇到了问题。

感谢您的帮助!

最佳答案

如果您不需要保存 MySQL 数据库中的全部数据,请使用 UserDefaults 保存订购数据。定义一个只包含dataId和indexPath的类:

class DataOrdering: NSObject, NSCoding {

var indexPath: IndexPath?
var dataId: String?

init(dataId: String, indexPath: IndexPath) {
super.init()
self.dataId = dataId
self.indexPath = indexPath
}

required init(coder aDecoder: NSCoder) {

if let dataId = aDecoder.decodeObject(forKey: "dataId") as? String {
self.dataId = dataId
}

if let indexPath = aDecoder.decodeObject(forKey: "indexPath") as? IndexPath {
self.indexPath = indexPath
}

}

func encode(with aCoder: NSCoder) {
aCoder.encode(dataId, forKey: "dataId")
aCoder.encode(indexPath, forKey: "indexPath")
}

func save(defaults key: String) -> Bool {

let defaults = UserDefaults.standard
let savedData = NSKeyedArchiver.archivedData(withRootObject: self)
defaults.set(savedData, forKey: key)
return defaults.synchronize()

}

convenience init?(defaults key: String) {

let defaults = UserDefaults.standard
if let data = defaults.object(forKey: key) as? Data,
let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? DataOrdering,
let dataId = obj.dataId,
let indexPath = obj.indexPath {
self.init(dataId: dataId, indexPath: indexPath)
} else {
return nil
}

}

class func allSavedOrdering(_ maxRows: Int) -> [Int: [DataOrdering]] {

var result: [Int: [DataOrdering]] = [:]
for section in 0...1 {
var rows: [DataOrdering] = []
for row in 0..<maxRows {
let indexPath = IndexPath(row: row, section: section)
if let ordering = DataOrdering(defaults: indexPath.defaultsKey) {
rows.append(ordering)
}
rows.sort(by: { $0.indexPath! < $1.indexPath! })
}
result[section] = rows
}

return result

}

}

Playground 示例:

let data = DataOrdering(dataId: "1", indexPath: IndexPath(row: 0, section: 0))

let savedData = NSKeyedArchiver.archivedData(withRootObject: data)
let obj = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? DataOrdering
obj?.dataId // print: "1"
obj?.indexPath // print: [0,0]

使用保存函数以“key”保存并通过 DataOrdering(defaults: "key") 读回

已更新

为 View Controller 添加代码以使用此类:

extension IndexPath {
var defaultsKey: String { return "data_ordering_\(section)_\(row)" }
}

class ViewController: UITableViewController {

var data: [Any]?
var items: [[Any]]?

func fetchData() {

// request from remote or local
data = [1, 2, 3, "a", "b", "c"] // sample data

// Update the items to first section has 0 elements,
// and place all data in section 1
items = [[], data ?? []]

// apply ordering
applySorting() { "\($0)" }

// save ordering
saveSorting() { "\($0)" }

// refresh the table view
tableView.reloadData()

}

func applySorting(_ dataIdBlock: (Any) -> String) {

// get all saved ordering
guard let data = self.data else { return }
let ordering = DataOrdering.allSavedOrdering(data.count)

var result: [[Any]] = [[], []]

for (section, ordering) in ordering {
guard section <= 1 else { continue } // make sure the section is 0 or 1
let rows = data.filter({ obj -> Bool in
return ordering.index(where: { $0.dataId == .some(dataIdBlock(obj)) }) != nil
})
result[section] = rows
}

self.items = result

}

func saveSorting(_ dataIdBlock: (Any) -> String) {

guard let items = self.items else { return }

for (section, rows) in items.enumerated() {
for (row, item) in rows.enumerated() {
let indexPath = IndexPath(row: row, section: section)
let dataId = dataIdBlock(item)
let ordering = DataOrdering(dataId: dataId, indexPath: indexPath)
ordering.save(defaults: indexPath.defaultsKey)
}
}

}

@IBAction func buttonMoveToSectionTapped(_ sender: UIButton) {

// if the sender's tag is row index
// or you can get indexPath by tableView.indexPath(for: cell) function too
let row = sender.tag

// move this item from section 1 to section 0 (last position)
if let item = items?[1].remove(at: row) {
items?[0].append(item)
}

// Save all sorting
saveSorting() { "\($0)" }

tableView.reloadData() // refresh table view

}

override func numberOfSections(in tableView: UITableView) -> Int {
return self.items?.count ?? 0
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items?[section].count ?? 0
}


}

关于ios - 使用 Swift 3 的核心数据指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41412168/

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