在init期间使用NSKeyedUnarchiver时出现问题

时间:2013-05-20 04:50:52

标签: ios nskeyedarchiver

我创建了一个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);
        }

    }

我认为我的总体战略是合理的,但我正在绊倒如何在初始化期间实际获取经理的存档版本!有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的班级需要实施<NSCoding>及其两种方法encodeWithCoder:来归档您的所有属性值,并initWithCoder:将其存档。确保在实现中调用super。通常,使用存档类的类会知道存档,但您可以使用init创建initForReadingWithData:然后调用NSKeyedUnarchiver来隐藏[self initWithCoder:...];中的知识。< / p>