我尽可能做空。
我有一个API请求,我从中获取数据(即Parse)。
当我收到结果时,我会将其写入Realm,然后将其添加到UICollectionView
数据源。
有些请求需要花费更多时间,这些请求会异步运行。我已经重新加载了数据源和集合视图后得到了所需的结果。
我将所需的更新从结果写入我的Realm数据库。
我已经读过可以使用Realm的Results
。但老实说,我并不了解它。我想有一种动态和安全的方式来处理集合视图和Realm。这是我现在的方法。
这就是我现在填充集合视图数据源的方式:
var dataSource = [Realm_item]()
其中Realm_item
是领域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获取对象并将其附加到数据源。如果它不存在,我创建一个新的Realm对象,编写它而不是附加它。
这在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)
}
}
谢谢!
答案 0 :(得分:2)
这里似乎有一些问题和问题,所以我会尽我所能。
我建议您使用结果类型作为数据源,例如:
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作为初学者时,这是一篇非常精心编写和有用的参考资料),有关于结果的说法......
结果是对基础数据的实时自动更新视图,这意味着永远不必重新获取结果。修改影响查询的对象将立即反映在结果中。
根据您设置的所有内容,您的里程可能会有所不同。您可以尝试发布您的Realm模型和Parse相关代码以供审核和评论。
你的上一个问题:
更新&#34;对象&#34;的正确方法是什么?从Realm DB中将更新写入同一对象后,从数据源中获取了什么?
当您更新基础数据时,我收集您并询问更新UI(CollectionView)的最佳方法?如果是的话......
您可以订阅Realm notifications以了解更新Realm数据的时间,指明应该刷新应用的UI的时间,而不必重新获取结果。