在Realm中保存许多图像(每个图像少于2MB)是一个好主意吗?

时间:2018-01-05 21:34:44

标签: ios swift core-data realm

最近,我正在考虑将我的应用数据从Core Data迁移到Realm。

但令我担心的是,Realm中没有任何属性称为:允许外部存储。我制作的有很多图像的应用程序需要保存。因此,我认为在Realm中以Data类型保存这些图像不是一个好主意,尽管所有这些图像都小于2MB(每个图像)。

enter image description here

所以,我的问题是:

  1. 将这些图片保存到Realm中的Data是个好主意吗? (每张图片少于2MB,但有很多图片) 不是一个好主意。
  2. 如果这不是个好主意。如何将图像保存到本地文件系统,而不仅仅使用String类型映射它们。我想使用新的Type(例如RealmImage)
  3. 像这样:

    class Person: Object {
        var name: String
        var avatar: ObjectWithImage
    }
    class ObjectWithImage : RealmObject {
        var imageUrl: String
    }
    

    没有这个:

    class Person: Object {
        var imageUrl: String
    }
    

    因此,我不想仅将图像文件路径保存为String类型。我想要做的是创建一个新类型(例如ObjectWithImage或类似的一些),它将包含图像的文件路径。原因是因为我也在使用 CloudKit 。因此,我必须使用 CloudKit 类型映射所有Realm类型。如果它是String类型,它将与原始String类型冲突。

    问题是CKAsset。我想要的是它可以支持CKAssetObjectWithImage可以使用CKAsset进行映射。

    下面的代码是其他类型的示例代码,我想在下面的代码中支持CKAsset

    public protocol CKRecordRecoverable {
        associatedtype O: Object
    }
    
    extension CKRecordRecoverable {//Mapping from CKRecord
        func parseFromRecord(record: CKRecord) -> O? {
            let o = O()
            var recordValue: Any?
            for prop in o.objectSchema.properties {
                switch prop.type {
                case .int:
                    recordValue = record.value(forKey: prop.name) as? Int
                case .string:
                    recordValue = record.value(forKey: prop.name) as? String
                case .bool:
                    recordValue = record.value(forKey: prop.name) as? Bool
                case .date:
                    recordValue = record.value(forKey: prop.name) as? Date
                case .float:
                    recordValue = record.value(forKey: prop.name) as? Float
                case .double:
                    recordValue = record.value(forKey: prop.name) as? Double
                case .data:
                    recordValue = record.value(forKey: prop.name) as? Data
                default:
                    print("Other types will be supported in the future.")
                }
                o.setValue(recordValue, forKey: prop.name)
            }
            return o
        }
    }
    
    public var record: CKRecord {
        let r = CKRecord(recordType: Self.recordType, recordID: recordID)
        let properties = objectSchema.properties
        for prop in properties {//Mapping to CloudKit type
            r[prop.name] = self[prop.name] as? CKRecordValue
        }
        return r
    }
    

    那么,有什么想法吗?

    -----------编辑-------------

    根据评论,我认为第二种选择是一种好方法:将图像保存到本地文件存储中。

    任何人都可以帮我思考如何使用CKRecord

    进行映射

    parseFromRecordrecord方法中。定义新类型以处理图像并将图像保存到本地文件存储中。

    我现在对此一无所知。非常感谢你。

    我从这个链接得到了一个理由:Why is it recommended practice to store images on disk rather than in a Realm

    但仍想知道如何制作......

1 个答案:

答案 0 :(得分:0)

当您看到Allows External Storage单词"外部"的CoreData复选框时并不意味着它存储在云端或设备之外的其他位置。它只是意味着它可以存储在持久存储之外的文件中。

换句话说,即使您选中Allows External Storage,您的照片仍会占用用户设备的空间。