3

这是一个非常典型的场景,但我想知道最好的方法是什么。

假设我需要构建一个与 REST API 交互的应用程序。然后,来自 Web 服务器的数据以多种方式显示在整个应用程序中。

通常我处理这个问题的方式是让一个单例处理所有数据操作(从/到服务器获取/存储数据并将数据保存在内存中。然后当我想在表格视图中显示这些数据时,我会访问这个单例直接在数据源方法中。例如 [[MyApi sharedInstance] arrayOfCustomObjects];

所以基本上每当应用程序的某些部分需要访问数据时,它都会通过访问单例来实现。

这是解决这个问题的好方法吗?还有其他可能更有用的模式吗?

另一种选择是,不是将数据存储在单例中,而是让每个控制器保存实例变量来存储它们需要的数据,然后使用单例仅从服务器获取数据,但自己存储数据。这里的问题是,如果控制器被提前解除,那么这个实例变量就会消失,服务器访问就被浪费了(但也许这是件好事?)。

最后,当您将持久性融入其中时,什么是好的策略?我想让 CoreData 位于网络调用和应用程序的其余部分之间会是一个好方法吗?

我想这里真正的问题是管理来自服务器的数据的最佳方法是什么,并且可能应该被持久化?

4

1 回答 1

2

这个问题有点宽泛,但我可以告诉你我通常是如何工作的。

我通常有一个用于 API 客户端的单例,以这种方式实现

+ (instancetype)sharedAPI {
    static dispatch_once_t once;
    static id _sharedInstance;
    dispatch_once(&once, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

然后我使用自动RestKit将我的 REST 资源映射到CoreData实体上。这种方法的美妙之处在于我不必手动处理CoreData持久性,但RestKit我在每次 API 请求时都会为我关心这一点。

我的 API 客户端所做的只是提供包装RestKitAPI 的有用方法。

例如,这是我用于检索当前用户信息的 API

- (void)getCurrentUserWithSuccess:(void (^)(HSUser *))success
                          failure:(void (^)(NSError *))failure {
    NSString * path = [NSString stringWithFormat:HS_API_USER_PATH, [HSUser currentUser].userId;
    [[RKObjectManager sharedManager] getObject:nil path:path parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        HSUser * user = [mappingResult firstObject];
        if (success) {
            success(user);
        }
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
        if (failure) {
            failure(error);
        }
    }];
}

在我的控制器逻辑中,我可以调用

[[HSAPI sharedAPI] getCurrentUserWithSuccess:^(HSUser * user) {
    //do something
} failure:^(NSError * error) {
    //do something else
}];

正如我之前所说,在这样的 API 调用之后,与当前用户对应的 HSUser 实例会自动持久化。

我觉得绝对方便。

于 2013-03-28T20:07:41.027 回答