gpt4 book ai didi

ios - 是否有类似分页的代码用于将 JSON 数据保存到 Realmdatabase

转载 作者:行者123 更新时间:2023-11-29 05:23:16 26 4
gpt4 key购买 nike

我有一个按钮,它下面是表格 View 。 TableView 单元格有一些随机数据。单击按钮时,我正在调用 api(函数名称为:api.urlRequest(userID: 80, businessUnitID: 2) ) 。我有一个具有 35 个 API ,0000 个条目。我想要的是将这些数据保存在 Realm 数据库中。问题是,当我调用保存函数时,我的用户界面卡住了。我将 JSON 数据附加到模型,然后将其保存到数据库。我可以获得 JSON 数据的开始索引和结束索引。

我尝试的是在后台线程上调用API,当调用保存函数时,我在主线程上调用它。但这并没有奏效。

class ViewController: UIViewController,getAdhocJSONDelegate{
let realm = try! Realm()
@IBOutlet weak var tableViewRef: UITableView!
var array = [NSDictionary]()
var adhocData : [AdhocModel] = []//for appending the JSON data to the model
var adhocDB : Results<AdhocDB>?// for accessing the database
let api = AdhocAPIParamteres()
var adhocJSONDatafromAPI : NSDictionary!
override func viewDidLoad() {
super.viewDidLoad()
adhocDB = realm.objects(AdhocDB.self)
}

@IBAction func buttonPressed(_ sender: Any) {
print("BUtton Tapped")
api.urlRequest(userID: 80, businessUnitID: 2)
api.delegate = self
}
func appTutorialData(json: NSDictionary) {
adhocJSONDatafromAPI = json
let apiData = adhocJSONDatafromAPI.value(forKey: "data") as! [NSDictionary]
print("Start Index of the data : ",apiData.startIndex)
print("End Index of the data : ",apiData.endIndex)
apiData.forEach { (abc) in
let model = AdhocModel()
model.site_id = abc.value(forKey: "site_id") as! Int
model.atm_id = abc.value(forKey: "atm_id") as! String
model.site_address = abc.value(forKey: "site_address") as! String
adhocData.append(model)
print("data appended")
DispatchQueue.main.async {
self.saveToDb(data:model)
}
}

func saveToDb(data: AdhocModel) {
let adhoc = AdhocDB()
try! realm.write {
adhoc.SiteId = data.site_id
adhoc.AtmId = data.atm_id
adhoc.SiteAdress = data.site_address
realm.add(adhoc)
}
}
}

我希望以一种让我的 UI 不会卡住的方式保存数据。

最佳答案

代码存在一些问题,并且在后台线程上将数据写入 Realm 已在 documentation 中介绍。所以我不会解决这个问题。遵循该设计模式将纠正 UI 锁定问题。

这是另一个问题

func saveToDb(data: AdhocModel) {
**let adhoc = AdhocDB()**

您想要将填充的模型写入 Realm ,但 AdhocDB 是结果对象,而不是 Realm 模型对象。此外,在 appTutorialData 中创建的 Realm 对象(即 model)被传递到 saveToDb,然后创建另一个对象,然后用第一个对象中的数据填充目的。没有理由这样做(在此代码中)

假设 AdHocModel 是一个 Realm 对象,这样就干净多了

func appTutorialData(json: NSDictionary) {
adhocJSONDatafromAPI = json
let apiData = adhocJSONDatafromAPI.value(forKey: "data") as! [NSDictionary]
print("Start Index of the data : ",apiData.startIndex)
print("End Index of the data : ",apiData.endIndex)
apiData.forEach { (abc) in
let model = AdhocModel()
model.site_id = abc.value(forKey: "site_id") as! Int
model.atm_id = abc.value(forKey: "atm_id") as! String
model.site_address = abc.value(forKey: "site_address") as! String
try! realm.write {
realm.add(model)
}
}
}

您需要将写入内容包装在后台线程中(再次参见文档),如下所示

DispatchQueue(label: "background").async {
autoreleasepool {
.
.
.
try! realm.write {
realm.add(model)
}
}
}

您可能会询问有关填充数组adhocData.append(model)的问题。我们不知道您正在用它做什么,但如果您将它用作 TableView 或其他一些 UI 元素的数据源,您可能需要考虑使用 Results 对象而不是 Array。

一个显着的优势是,如果您有 35,000 个对象,那么这是一个相当大的数组,如果您有更多对象,它可能会压垮设备,因为所有数据都存储在内存中。但是,结果对象是延迟加载的,因此您可以拥有更大的数据集,而不会压垮设备。

此外,当 Realm 对象存储在数组中时,它们会与 Realm 断开连接并释放 Realm 功能 - 它们不会自动更新,也不会在该数组中反射(reflect)对 Realm 中实际对象的更改,也不能只更新该对象 - 它似乎没有主键。

但是,如果您使用这些模型填充 Results 对象,它们将实时更新 - 例如,如果 Realm 中的 atm_id 发生更改,该对象将自动更新。如果您需要更改属性,您可以在写入事务中直接在该对象上更改它。

因此,模式是拥有一个 Results 类 var,并将对象加载到 viewDidLoad 中的这些结果中。当您添加更多模型时,结果对象将自动更新。

为了让您的 UI 保持新鲜感,您可能需要向这些结果添加观察者(又名 Notifications ),以便您可以在对象更新时收到通知,以便您可以重新加载 tableView。

关于ios - 是否有类似分页的代码用于将 JSON 数据保存到 Realmdatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58449509/

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