Objective c 同步的NSKeyedArchiver或NSUserDefaults
我有一个singleton delayed transaction manager类,负责将iphone到应用程序服务器的事务排队和退队,这些事务由于各种因素(网络可达性、接近性等)而无法完成。当恢复可达性/接近性时,它会尝试将事务出列。另一个事务也有可能在退出队列的同时进入队列。Objective c 同步的NSKeyedArchiver或NSUserDefaults,objective-c,nsuserdefaults,nskeyedarchiver,synchronize,Objective C,Nsuserdefaults,Nskeyedarchiver,Synchronize,我有一个singleton delayed transaction manager类,负责将iphone到应用程序服务器的事务排队和退队,这些事务由于各种因素(网络可达性、接近性等)而无法完成。当恢复可达性/接近性时,它会尝试将事务出列。另一个事务也有可能在退出队列的同时进入队列。 我的理解是NSUserDefaults是可变字典的线程安全包装,这正是我想要的。同样的SO链接认为NSUserDefaults是针对用户偏好的 这些事务不是用户的首选项,但这是我想要的功能。 因此,这里有一个问题,我
我的理解是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可能会污染首选项名称空间,您可能会发现以后要将其与首选项包一起使用,等等
围绕读/写操作执行锁定应该可以工作。对我来说,在文件操作周围加锁感觉很奇怪;您还可以将队列对象保留在内存中(带有锁定),并且只定期从主线程刷新它。或者使用磁盘上的锁定文件来保护写入/读取