我创建了一个FacebookManager单例,当我的应用程序启动时,它会在后台线程上调用。一切都与facebook经理单身人士,应用程序等一起正常工作。但是,当应用程序首次启动时,它还有很长一段时间才有用,因为facebook经理还没有完成它的事情。所以我想要做的是使用NSKeyedArchiver保存facebookManager及其所有词典,以便在启动时,应用程序具有可导航的界面,而Facebook数据在后台更新。有意义吗?
所有在FacebookManager.m中,首先,当经理完成更新朋友词典等时,我调用保存数据的方法:
- (BOOL)saveFacebookData
{
// returns success or failure
NSString *path = [self archivePath]; // just a helper method
return [NSKeyedArchiver archiveRootObject:self toFile:path];
}
然后在init中,我正在尝试这个,这似乎不起作用。 :
-(id)init
{
self = [super init];
NSString *path = [self archivePath];
self = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
// If the manager hadn't been saved previously, create a new new one
if (!self) {
if (_idsByNameDict == nil) {
_idsByNameDict = [[NSMutableDictionary alloc] init];
}
if (_photosByNameDict == nil) {
_photosByNameDict = [[NSMutableDictionary alloc] init];
}
if (_installedByNameDict == nil) {
_installedByNameDict = [[NSMutableDictionary alloc] init];
}
if (_allFriendsArray == nil) {
_allFriendsArray = [[NSArray alloc] init];
}
basicPermissions = NO;
extendedPermissions = NO;
// Create synchronous dispatch queue for all facebook activity
if (_facebookUpdateQueue == nil) {
_facebookUpdateQueue = dispatch_queue_create("com.facebookUpdateQueue", NULL);
}
}
我认为我的总体战略是合理的,但我正在绊倒如何在初始化期间实际获取经理的存档版本!有什么建议吗?
答案 0 :(得分:1)
您的班级需要实施<NSCoding>
及其两种方法encodeWithCoder:
来归档您的所有属性值,并initWithCoder:
将其存档。确保在实现中调用super。通常,使用存档类的类会知道存档,但您可以使用init
创建initForReadingWithData:
然后调用NSKeyedUnarchiver
来隐藏[self initWithCoder:...];
中的知识。< / p>