你应该在Realm iOS中异步存储图像吗?

时间:2015-08-17 13:50:54

标签: ios objective-c afnetworking realm

我目前正在使用Realm来创建我正在创建的应用中的数据持久性。

我要做的是,当应用程序首次打开时,它会从api中获取数据。我希望从获取的数据中获取所有内容并将其存储,以便即使没有活动的Internet连接也可以使用该应用程序。

但我可以实现存储字符串,如用户名和手机号码,但我不知道如何存储图像。

这是我到目前为止所做的:

@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的新手,但这是我第一次使用realm等。但是,我怀疑线程问题,因为提交是在主线程上完成的。我也很想知道这是不好的做法。

干杯

1 个答案:

答案 0 :(得分:6)

虽然您可以将图像存储在Realm中作为NSData属性,但我建议将图像写入磁盘,或使用Pinterest的PINCache之类的东西,并将路径/键存储在Realm中作为字符串属性