您应该在 Realm iOS 中异步存储图像吗?
Should you asynchronously store images in Realm iOS?
我目前正在使用 Realm 在我正在创建的应用程序中进行数据持久化。
我想要做的是,当应用程序首次打开时,它会从 api 中获取数据。我想从获取的数据中获取所有内容并存储它,这样即使没有活动的互联网连接也可以使用该应用程序。
不过我可以实现存储用户名和手机号码等字符串,但我不确定如何存储图像。
这是我目前拥有的:
@interface User : RLMObject
@property NSString *userName;
@property NSString *mobileNumber;
@property NSData *avatarData;
@end
- (void)viewDidLoad {
[super viewDidLoad];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:[NSString stringWithFormat:@"%@users?auth_token=%@",BASE_URL,AUTHENTICATION_TOKEN]parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
[self storeFetchedData: responseObject];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
- (void)storeFetchedData:(NSDictionary *)list {
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for (id slUser in list) {
User *user = [[User alloc] init];
user.userName = slUser[@"name"];
user.realName = slUser[@"mobileNumber"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
user.avatarData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:slUser[@"image_url"]]];
});
}
[realm commitWriteTransaction];
}
[self.tableView reloadData];
我不是 iOS 的新手,但这是我第一次使用领域等。但是,我怀疑线程问题,因为提交是在主线程上完成的。我也很想知道这是否是不好的做法。
干杯
虽然您可以将图像作为 NSData
属性存储在 Realm 中,但我建议将图像写入磁盘,或使用类似 Pinterest 的 PINCache,并将 path/key 存储在 Realm 中作为字符串 属性.
我目前正在使用 Realm 在我正在创建的应用程序中进行数据持久化。
我想要做的是,当应用程序首次打开时,它会从 api 中获取数据。我想从获取的数据中获取所有内容并存储它,这样即使没有活动的互联网连接也可以使用该应用程序。
不过我可以实现存储用户名和手机号码等字符串,但我不确定如何存储图像。
这是我目前拥有的:
@interface User : RLMObject
@property NSString *userName;
@property NSString *mobileNumber;
@property NSData *avatarData;
@end
- (void)viewDidLoad {
[super viewDidLoad];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:[NSString stringWithFormat:@"%@users?auth_token=%@",BASE_URL,AUTHENTICATION_TOKEN]parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
[self storeFetchedData: responseObject];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
- (void)storeFetchedData:(NSDictionary *)list {
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for (id slUser in list) {
User *user = [[User alloc] init];
user.userName = slUser[@"name"];
user.realName = slUser[@"mobileNumber"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
user.avatarData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:slUser[@"image_url"]]];
});
}
[realm commitWriteTransaction];
}
[self.tableView reloadData];
我不是 iOS 的新手,但这是我第一次使用领域等。但是,我怀疑线程问题,因为提交是在主线程上完成的。我也很想知道这是否是不好的做法。
干杯
虽然您可以将图像作为 NSData
属性存储在 Realm 中,但我建议将图像写入磁盘,或使用类似 Pinterest 的 PINCache,并将 path/key 存储在 Realm 中作为字符串 属性.