同步NSKeyedArchiver或NSUserDefaults

时间:2011-05-25 13:05:23

标签: objective-c nsuserdefaults nskeyedarchiver synchronize

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

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

一些代码:

 - (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?

1 个答案:

答案 0 :(得分:1)

NSUserDefaults确实是线程安全的(says so in the docs)。但从概念上讲,它真的不是像你一样做的事情。它会起作用,但是你最终会得到你的事务ID,这可能会污染你可能会想要稍后使用偏好包等的偏好命名空间。

对读/写进行锁定应该有效。把锁放在文件操作上对我来说很奇怪;你也可以将队列对象保存在内存中(带锁定),并且只能定期从例如主线程。或者在磁盘上使用lockfile来保护写入/读取。