gpt4 book ai didi

ios - 将 Realm 与 Collection View 数据源最佳实践结合使用

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:51 24 4
gpt4 key购买 nike

我会尽量缩短。

我有一个 API 请求,我从中获取数据(即 Parse)。

当我得到结果时,我将其写入 Realm,然后将它们添加到 UICollectionView 的数据源。

有些请求会花费更多时间,它们是异步运行的。在重新加载数据源和 Collection View 后,我得到了所需的结果。

我正在将结果所需的更新写入我的 Realm 数据库。

我读到可以使用 Realm 的 Results .但老实说我不明白。我想有一种动态且安全的方式来处理 Collection View 和 Realm。这是我现在的方法。

这就是我目前填充 Collection View 数据源的方式:

声明

var dataSource = [Realm_item]()

其中 Realm_item 是一个 Realm Object 类型。

循环和写入

override func viewDidLoad() {
super.viewDidLoad()
for nowResult in FetchedResultsFromAPI
{
let item = Realm_item()
item.item_Title = nowResult["Title"] as! String
item.item_Price = nowResult["Price"] as! String
// Example - Will write it later after the collectionView Done - Async request
GetFileFromImageAndThanWriteRealm(x.image)
// Example - Will write it later after the collectionView Done - Async request
dataSource.append(item)
}

//After finish running over the results *Before writing the image data*
try! self.realm.write {
self.realm.add(self.dataSource)
}
myCollectionView.reloadData()
}

在我将图像写入 Realm 到一个已经创建的“对象”之后。相同的 Realm 对象(具有相同的主键)会在数据源中自动更新吗?

在我将更新写入 Realm DB 中的同一对象后,从数据源更新对象的正确方法是什么?

更新

模型类

class Realm_item: Object {
dynamic var item_ID : String!
dynamic var item_Title : String!
dynamic var item_Price : String!
dynamic var imgPath : String?

override class func primaryKey() -> String {
return "item_ID"
}
}

首先,我要检查 Realm 中是否存在“对象 ID”。如果是,我从 Realm 获取对象并将其附加到数据源。如果它不存在,我会创建一个新的 Realm 对象,写入并附加它。

从 Parse 中获取数据

这发生在 viewDidLoad 方法中并准备数据源:

var query = PFQuery(className:"Realm_item")
query.limit = 100
query.findObjectsInBackgroundWithBlock { (respond, error) -> Void in
if error == nil
{
for x in respond!
{
if let FetchedItem = self.realm.objectForPrimaryKey(Realm_item.self, key: x.objectId!)
{
self.dataSource.append(FetchedItem)
}
else
{
let item = Realm_item()
item.item_ID = x.objectId
item.item_Title = x["Title"] as! String
item.item_Price = x["Price"] as! String
let file = x["Images"] as! PFFile
RealmHelper().getAndSaveImageFromPFFile(file, named: x.objectId!)
self.dataSource.append(item)
}
}

try! self.realm.write {
self.realm.add(self.dataSource)
}

self.myCollectionView.reloadData()
print(respond?.count)
}
}

谢谢!

最佳答案

你好像有几个疑问和问题,我会尽力的。

我建议您使用结果类型作为数据源,例如:

var dataSource: Results<Realm_item>?

然后,在您的 viewDidLoad() 中:

dataSource = realm.objects(Realm_item) .

使用dataSource前一定要进行相关的错误检查。我们使用可选的 Results<Realm_item>因为您正在使用它的 Realm 对象需要先初始化。也就是说,你会得到类似 "Instance member * cannot be used on type *" 的东西如果你尝试声明像 let dataSource = realm.objects(Realm_item) 这样的结果.


Realm documentation (当你像我一样使用 Realm 时,这是一个写得很好且很有用的引用),关于结果有什么要说的......

Results are live, auto-updating views into the underlying data, which means results never have to be re-fetched. Modifying objects that affect the query will be reflected in the results immediately.

您的里程可能会有所不同,具体取决于您如何设置所有内容。您可以尝试发布您的 Realm 模型和 Parse 相关代码以供审查和评论。

你的最后一个问题:

What is the right way to update the "object" from the Data Source after i wrote the update to same object from the Realm DB?

我了解到您是在询问当基础数据已更新时更新 UI (CollectionView) 的最佳方式?如果是这样...

You can subscribe to Realm notifications to know when Realm data is updated, indicating when your app’s UI should be refreshed for example, without having to re-fetch your Results.

关于ios - 将 Realm 与 Collection View 数据源最佳实践结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235790/

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