gpt4 book ai didi

iOS web api数据管理(单例?)

转载 作者:行者123 更新时间:2023-12-04 17:18:37 35 4
gpt4 key购买 nike

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

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

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

所以基本上,只要应用的某些部分需要访问数据,它就会通过访问单例来实现。

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

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

最后,将持久性融入其中的好策略是什么?我想在网络调用和应用程序的其余部分之间放置 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);
}
}];
}

在我的 Controller 逻辑中我可以调用

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

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

我觉得绝对方便。

关于iOS web api数据管理(单例?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690931/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com