0

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

    }

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

4

1 回答 1

1

您的类需要实现<NSCoding>它的两个方法encodeWithCoder:来归档所有属性值并将initWithCoder:它们归档。确保在实现中调用 super 。通常,使用存档类的类会知道存档,但您可以init通过使用initForReadingWithData:来隐藏该知识NSKeyedUnarchiver,然后调用[self initWithCoder:...];.

于 2013-05-20T06:55:14.633 回答