我有一个单例延迟事务管理器类,它负责将由于各种因素(网络可达性,邻近性等)无法完成的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?
答案 0 :(得分:1)
NSUserDefaults
确实是线程安全的(says so in the docs)。但从概念上讲,它真的不是像你一样做的事情。它会起作用,但是你最终会得到你的事务ID,这可能会污染你可能会想要稍后使用偏好包等的偏好命名空间。
对读/写进行锁定应该有效。把锁放在文件操作上对我来说很奇怪;你也可以将队列对象保存在内存中(带锁定),并且只能定期从例如主线程。或者在磁盘上使用lockfile来保护写入/读取。