在整个应用程序中使用单个域实例/变量

时间:2016-08-04 06:32:25

标签: ios swift realm

目标减少内存占用

我的方法是在AppDelegate类中创建单一领域实例&然后访问它而不是每次都创建一个新变量。

  

的AppDelegate

lazy var realm: Realm = {
    let realm = try! Realm()
    // Get our Realm file's parent directory
    if let folderPath = realm.configuration.fileURL?.URLByDeletingLastPathComponent?.path{
        // Disable file protection for this directory
        do {
            try NSFileManager.defaultManager().setAttributes([NSFileProtectionKey: NSFileProtectionNone],ofItemAtPath: folderPath)
        }catch {
            printDebug(error)
        }
    }
    return realm
}()
  

的UIViewController

var realm = (UIApplication.sharedApplication().delegate as! AppDelegate).realm

// Access/Modify realm object
try! self.realm.write{
     location.imageFile = fileName
}
  

问题

1。这有助于减少内存使用量吗?

2。有什么缺点?

2 个答案:

答案 0 :(得分:2)

有趣的问题

1。 在我看来,主要的缺点是,如果你打算将GCD与Realm一起使用。请记住,Realm是线程安全的,因此您不能跨线程/队列使用/修改Realm对象。

我用经理管理Realm是单身人士。也许有人有更好的解决方案,但这很有效。

class CouponManager: NSObject {
        /// path for realm file 
    lazy private var realmURL: NSURL = {
        let documentUrl = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)[0]
        let url = documentUrl.URLByAppendingPathComponent("coupons.realm")
        return url
    }()
    lazy private var config:Realm.Configuration = {
        return Realm.Configuration(
            fileURL: self.realmURL,
            inMemoryIdentifier: nil,
            encryptionKey: "my65bitkey".dataUsingEncoding(NSUTF8StringEncoding),
            readOnly: false,
            schemaVersion: 1,
            migrationBlock: nil,
            deleteRealmIfMigrationNeeded: false,
            objectTypes: nil)
    }()

    static let shared: CouponManager = CouponManager()

    func save(coupons coupons:[Coupon]) {
        let realm = try! Realm(configuration: config)
        try! realm.write(){
            realm.deleteAll()
            realm.add(coupons)
        }
    }

    func load() -> Results<Coupon> {
        let realm = try! Realm(configuration: config)
        return realm.objects(Coupon)
    }

    func deleteAll() {
        let realm = try! Realm(configuration: config)
        try! realm.write({ 
            realm.deleteAll()
        })
    }
}

2。 使用Realm时,您不必担心内存。正如 TiM (他在Realm中工作)在this answer中说过,你应该在每次需要的时候实例化Realm。

答案 1 :(得分:2)

问题

  1. 这有助于减少内存使用量吗?
  2. 根据我的经验,获取领域的共享实例并设置URL并不是一项繁重的任务。然而,有时打开和关闭交易(取决于你这样做的频率,但在一天结束时,大多数客户写得不够重要)。 所以我的答案是没有,这对内存使用没有帮助。 顺便说一下,您是否对您的应用进行了分析,以检查您的内存使用量是否达到了?这是一个很好的起点。

    1. 有什么缺点?
    2. 我已经使用领域已经有一段时间了,我已经用Realm编写了2个应用程序。现在我要说的不是关于内存使用,而是关于设计。

      一个。你知道的领域是一个数据库。而且你不应该只是从应用程序中的任何随机位置(而不是从viewController)访问它,特别是不要用你的某些类(例如UsersDataBase类)使用它,并且我将解释。 当数据库中的对象开始发生变化时,您需要知道谁是,是谁以及从巫婆线程写入数据库。 有一个地方你可以检查和调试。当我在你的应用程序中使用时,我很难调试。

      B中。领域不是线程安全的。这意味着你真的想知道巫婆线程领域也是如此。如果没有,你将最终得到线程执行,并相信,这不是一个有趣的事情来处理。特别是当领域有时无法帮助堆栈跟踪时。

      ℃。您正在使用&#34; UIApplication.sharedApplication()&#34;访问AppDelegate上的域。这不是最佳做法,因为您无法访问&#34; UIApplication.sharedApplication()&#34;来自不同的上下文,例如App Extensions。当您想要将应用扩展程序添加到您的应用中时,您最终会重新编写您使用它的任何地方。