【问题标题】:Synchronized NSKeyedArchiver or NSUserDefaults同步的 NSKeyedArchiver 或 NSUserDefaults
【发布时间】:2011-09-01 18:24:55
【问题描述】:

我有一个单例延迟事务管理器类,它负责将由于多种因素(网络可达性、邻近性等)而无法完成的 iphone 到应用程序服务器的事务入队和出队。当可达性/邻近性恢复时,它会尝试使事务出队。也有可能在出队发生的同时另一个事务被入队。
我的理解是 NSUserDefaults 是可变字典SO link 的线程安全包装器,这正是我想要的。同样的 SO 链接认为 NSUserDefaults 是针对用户偏好的。

这些交易不是用户偏好,但这是我想要的功能。 所以,这里的问题是,我可以在 NSUserDefaults 中读取/写入/同步事务的 NSMutableDictionary 而不破坏字典,还是需要通过 NSKeyed(Un)Archiver 读取和写入来实现自己的锁定机制(见下文)?

一些代码:

 - (void) queThing:(Thing *)aThing {

   // @synchronized this block?
   NSMutableDictionary * QD = [self readFile];
   [QD setObject:aThing forKey:aThing.thingId];
   [self writeFile: QD];
   // @ sync?
}
- (void) writeFile:(NSMutableDictionary *)theData {
    BOOL status = [NSKeyedArchiver archiveRootObject: theData toFile:archivePath];
    if ( !status) {
       DebugLog(@"Write to archive failed.");
    } else {
       DebugLog(@"Write to archive SUCCEEDED.");
    }
 }
 - (NSMutableDictionary *) readFile {
   NSMutableDictionary *Q =[NSKeyedUnarchiver  unarchiveObjectWithFile:archivePath];
   if ( ! Q ) {
       Q = [NSMutableDictionary dictionaryWithCapacity:2];
   }
   return Q;
 }

出队:

    // @synchronized this block?
    NSMutableDictionary * QD = [self readFile];
    [QD removeObjectForKey:thing.thingId];
    [self writeFile: QD];
    // @ sync?

【问题讨论】:

    标签: objective-c nsuserdefaults nskeyedarchiver synchronize


    【解决方案1】:

    NSUserDefaults 确实是线程安全的(says so in the docs)。但从概念上讲,它真的不是做你正在做的事情的地方。它会起作用,但最终您的事务 ID 可能会污染首选项命名空间,您可能会发现以后想将其与首选项包一起使用,等等。

    围绕读/写进行锁定应该可以工作。给文件操作加锁对我来说很奇怪;您还可以将队列对象保留在内存中(带锁定),并且仅定期从例如主线程。或者使用磁盘上的锁定文件来保护写入/读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多