这是一个非常典型的场景,但我想知道最好的方法是什么。
假设我需要构建一个与 REST API 交互的应用程序。 然后,来自网络服务器的数据在整个应用程序中以多种方式显示。
通常我处理这个问题的方法是让一个单例处理所有数据操作(从服务器获取/存储到服务器以及将数据保存在内存中。然后,当我想在表视图中显示这些数据时,我会直接在数据源方法中访问此单例。例如
[[MyApi sharedInstance] arrayOfCustomObjects];
。
所以基本上每当应用程序的某些部分需要访问数据时,它都会通过访问单例来实现。
这是解决这个问题的好方法吗? 还有其他可能更有用的模式吗?
另一种方法是,不将数据存储在单例中,而是让每个控制器保存实例变量来存储它们需要的数据,然后仅使用单例从服务器获取数据,但存储数据本身。 这里的问题是,如果控制器过早关闭,那么该实例变量就会消失,服务器访问就会被浪费(但这也许是一件好事?)。
最后,当你坚持不懈时,什么是好的策略? 我想将 CoreData 放在网络调用和应用程序的其余部分之间会是一个好方法吗?
我想这里真正的问题是管理来自服务器并且应该保留的数据的最佳方法是什么?
这个问题有点宽泛,但我可以告诉你我通常是如何工作的。
我通常有一个用于 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 客户端所做的只是提供包装
RestKit
API 的有用方法。
例如,这是我用于检索当前用户信息的 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 实例将自动保留。
我觉得这绝对方便。