使用Realm和Collection View数据源最佳实践

时间:2015-12-12 03:06:45

标签: ios swift uicollectionview realm

我尽可能做空。

我有一个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对象,编写它而不是附加它。

从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)
    }
}

谢谢!

1 个答案:

答案 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的时间,而不必重新获取结果。