Objective c 同步的NSKeyedArchiver或NSUserDefaults

Objective c 同步的NSKeyedArchiver或NSUserDefaults,objective-c,nsuserdefaults,nskeyedarchiver,synchronize,Objective C,Nsuserdefaults,Nskeyedarchiver,Synchronize,我有一个singleton delayed transaction manager类,负责将iphone到应用程序服务器的事务排队和退队,这些事务由于各种因素(网络可达性、接近性等)而无法完成。当恢复可达性/接近性时,它会尝试将事务出列。另一个事务也有可能在退出队列的同时进入队列。 我的理解是NSUserDefaults是可变字典的线程安全包装,这正是我想要的。同样的SO链接认为NSUserDefaults是针对用户偏好的 这些事务不是用户的首选项,但这是我想要的功能。 因此,这里有一个问题,我

我有一个singleton delayed transaction manager类,负责将iphone到应用程序服务器的事务排队和退队,这些事务由于各种因素(网络可达性、接近性等)而无法完成。当恢复可达性/接近性时,它会尝试将事务出列。另一个事务也有可能在退出队列的同时进入队列。
我的理解是NSUserDefaults是可变字典的线程安全包装,这正是我想要的。同样的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?

确实,
NSUserDefaults
是线程安全的(It)。但从概念上讲,这真的不是一个像你这样做事的地方。它会起作用,但最终您的事务ID可能会污染首选项名称空间,您可能会发现以后要将其与首选项包一起使用,等等


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

确实
NSUserDefaults
是线程安全的(It)。但从概念上讲,这真的不是一个像你这样做事的地方。它会起作用,但最终您的事务ID可能会污染首选项名称空间,您可能会发现以后要将其与首选项包一起使用,等等

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