使用RealmSwift拖放重新排序UicollectioView项目

时间:2016-07-11 12:51:56

标签: swift2 uicollectionview ios9 realm

我尝试使用RealmSwift拖拽重新排序UICollectionViewcell图像作为数据库,我的UI没有更新拖放和奇怪的行为,有些图像是重复的,我的代码是这样的

RealmModel As

class StoryAlbumDM: Object {

    dynamic var id = 0
    dynamic var type = ""
    dynamic var isImage: Int = 0
    dynamic var textData = ""
    dynamic var imageData: NSData? = nil
    dynamic var rowId: Int = 0
    dynamic var position: Int = 0
    dynamic var storyId: Int = 0
    dynamic var isCoverImage: Int = 0
    dynamic var imagePath = ""

    let allStories = List<StoryAlbumDM>()
}

在拖放时,我喜欢这样做

func collectionView(collectionView: UICollectionView, atIndexPath: NSIndexPath, didMoveToIndexPath toIndexPath: NSIndexPath) {

        print("moveItemAtIndexPath")
        let fromIndexPath: Int = atIndexPath.row
        print("from", fromIndexPath)

        let toIndexPathInt: Int = toIndexPath.row
        print("To", toIndexPath)
        let fromData: StoryAlbumDM!
        fromData = realm.objects(StoryAlbumDM.self).filter("position = %d AND storyId = %d", fromIndexPath, self.storyID).first!
        let toData: StoryAlbumDM!
        toData = realm.objects(StoryAlbumDM.self).filter("position = %d AND storyId = %d", toIndexPath, self.storyID).first!
        var tempData = StoryAlbumDM()

        self.performSelectorOnMainThread(#selector(StoryViewController.updateSrtoryInRealm), withObject: self.collectionView, waitUntilDone: true)

        dispatch_async(dispatch_get_main_queue(), {
            self.collectionView.performBatchUpdates({
                self.collectionView.reloadData()
                }, completion: nil)
        })
  }

func updateSrtoryInRealm() {

        self.tempData.type = self.toData.type
        self.tempData.isImage = self.toData.isImage
        self.tempData.textData = self.toData.textData
        self.tempData.rowId = self.toData.rowId
        self.tempData.imageData = self.toData.imageData
        self.tempData.position = self.toData.position
        self.tempData.storyId = self.toData.storyId
        self.tempData.isCoverImage = self.toData.isCoverImage
        self.tempData.imagePath = self.toData.imagePath

        do {
            try! realm.write {

                self.toData.type = self.fromData.type
                self.toData.isImage = self.fromData.isImage
                self.toData.textData = self.fromData.textData
                self.toData.rowId = self.fromData.rowId
                self.toData.imageData = self.fromData.imageData
                self.toData.position = self.fromData.position
                self.toData.storyId = self.fromData.storyId
                self.toData.isCoverImage = self.fromData.isCoverImage
                self.toData.imagePath = self.fromData.imagePath

                // title.id = temp.id
                self.fromData.type = self.tempData.type
                self.fromData.isImage = self.tempData.isImage
                self.fromData.textData = self.tempData.textData
                self.fromData.rowId = self.tempData.rowId
                self.fromData.imageData = self.tempData.imageData
                self.fromData.position = self.tempData.position
                self.fromData.storyId = self.tempData.storyId
                self.fromData.isCoverImage = self.tempData.isCoverImage
                self.fromData.imagePath = self.tempData.imagePath
            }
            //}
        }
        catch {
            print("Printed error : ")
        }

问题:图片是重复的,没有在UI上更新,重新排序奇怪的行为,请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

我最近回答a similar question,但我会在这里重新解释一下。 :)

很容易,在Realm文件中重新排序Realm对象的最佳和最快捷的方法是创建一个包含给定类型的所有Realm对象的总体List对象。

例如,在这种情况下,您创建另一个对象来保存您已创建的allStories值:

// Model class that manages the ordering of story album objects
class StoryAlbumDMList: Object {
   let allStories = List<StoryAlbumDM>()
}

// Model class for the actual story album objects
class StoryAlbumDM: Object {
   dynamic var id = 0
   dynamic var type = ""
   dynamic var isImage: Int = 0
   dynamic var textData = ""
   dynamic var imageData: NSData? = nil
   dynamic var rowId: Int = 0
   dynamic var position: Int = 0
   dynamic var storyId: Int = 0
   dynamic var isCoverImage: Int = 0
   dynamic var imagePath = ""
}

这样,当你想重新排序列表时,你需要做的就是在这个数组中重新排序。

就像我在另一个问题中说的那样,你可以做的另一种方式(哪个不太好,但也不需要额外的Realm对象)是添加另一个名为orderedIndex的属性,它只包含一个数字,表示这些对象的数字顺序。如果您想重新订购它们,只需重新设置这些数字即可。

如果您需要进一步澄清,请与我们联系!