Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将领域与集合视图数据源一起使用最佳实践_Ios_Swift_Uicollectionview_Realm - Fatal编程技术网

Ios 将领域与集合视图数据源一起使用最佳实践

Ios 将领域与集合视图数据源一起使用最佳实践,ios,swift,uicollectionview,realm,Ios,Swift,Uicollectionview,Realm,我会尽量简短 我有一个从中获取数据的API请求(即解析) 当我得到结果时,我将其写入领域,然后将它们添加到UICollectionView的数据源中 有些请求需要更多的时间,它们是异步运行的。在重新加载数据源和集合视图之后,我将获得所需的结果 我正在将所需的更新从结果写入我的领域数据库 我已经读到,可以使用Realm的。但我真的不明白。我想有一种动态和安全的方式来处理集合视图和领域。这是我目前的做法 这就是我目前填充集合视图数据源的方式: 宣言 其中,Realm\u项是一个Realm对象类型 循

我会尽量简短

我有一个从中获取数据的API请求(即解析)

当我得到结果时,我将其写入领域,然后将它们添加到
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)
    }
}