Ios 将领域与集合视图数据源一起使用最佳实践
我会尽量简短 我有一个从中获取数据的API请求(即解析) 当我得到结果时,我将其写入领域,然后将它们添加到Ios 将领域与集合视图数据源一起使用最佳实践,ios,swift,uicollectionview,realm,Ios,Swift,Uicollectionview,Realm,我会尽量简短 我有一个从中获取数据的API请求(即解析) 当我得到结果时,我将其写入领域,然后将它们添加到UICollectionView的数据源中 有些请求需要更多的时间,它们是异步运行的。在重新加载数据源和集合视图之后,我将获得所需的结果 我正在将所需的更新从结果写入我的领域数据库 我已经读到,可以使用Realm的。但我真的不明白。我想有一种动态和安全的方式来处理集合视图和领域。这是我目前的做法 这就是我目前填充集合视图数据源的方式: 宣言 其中,Realm\u项是一个Realm对象类型 循
UICollectionView
的数据源中
有些请求需要更多的时间,它们是异步运行的。在重新加载数据源和集合视图之后,我将获得所需的结果
我正在将所需的更新从结果写入我的领域数据库
我已经读到,可以使用Realm的。但我真的不明白。我想有一种动态和安全的方式来处理集合视图和领域。这是我目前的做法
这就是我目前填充集合视图数据源的方式:
宣言
其中,Realm\u项
是一个Realm对象
类型
循环与写作
在我将图像写入已创建的“对象”的领域之后。相同的领域对象(具有相同的主键)是否会在数据源中自动更新
在我从领域数据库向同一对象写入更新之后,从数据源更新对象的正确方法是什么
更新
模范班
首先,我检查领域中是否存在“对象id”。如果有,我将从领域中获取对象并将其附加到数据源。如果它不存在,我创建一个新的领域对象,编写它,然后附加它
从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数据源:结果?
然后,在viewDidLoad()中:
dataSource=realm.objects(realm\u项)
在使用数据源之前,请确保使用相关的错误检查。我们使用可选的Results
,因为您使用它的领域对象需要先初始化。也就是说,如果您尝试像让dataSource=realm.objects(realm\u项)
这样声明结果,您将得到类似于的内容“实例成员*不能用于类型*”
(当你像我这样的初学者使用领域时,这是一个非常好的书面和有用的参考资料),关于结果有这样的说法
结果是实时的,自动将视图更新到基础数据中,这意味着不必重新获取结果。修改影响查询的对象将立即反映在结果中
您的里程数可能会因您的设置方式而异。您可以尝试发布您的领域模型并解析相关代码以供审阅和评论
最后一个问题:
在我从领域数据库向同一对象写入更新之后,从数据源更新“对象”的正确方法是什么
我想你是在问当基础数据更新后更新UI(CollectionView)的最佳方式?如果是的话
您可以订阅以了解域数据何时更新,例如,指示应用程序的UI何时应刷新,而无需重新获取结果
首先,谢谢你!我将更新上面的代码以提供更多信息。我已更新代码:)。几个问题-1)对于“Results”类型的数组,我可以设置特定的查询吗?比如,像我上面做的那样?通过附加对象而不仅仅是查询来装箱“结果”数组?2) 如果我注册到域通知,我如何更新数据源中的特定项?非常感谢。
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()
}
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"
}
}
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)
}
}