使用异步下载后将 UIImage 保存到核心数据或图像路径

Save UIImage in to core data or Image path after downloading with Asynchronously

我有一个 api 可以获取数据,包括来自 api 的图像 url 并将数据存储在核心数据中。

我正在使用 AFNetworking 异步获取数据,没有任何问题。

但是,我现在需要预取图像并将 UIImage 或其本地路径存储在 CoreData 而不是远程 url。

我对 AFHTTPSessionManager 进行了子类化并使用:

    return [self POST:urlPath parameters:parameters success:^(NSURLSessionDataTask * __unused task, id JSON) {

    NSArray *postsFromResponse = JSON;
    if([postsFromResponse count] > 0)
    {
        for (NSDictionary *resp in postsFromResponse)
        {

            gotResponse = YES;
            NSNumber *Id = [resp valueForKey:@"Id"];
            NSString  *imageUrl = [resp valueForKey:@"url"];

            Post*info = [self getPostWithId:Id];

                if (!info)
                {
                    info = (Post*)[NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];

                }
                info.imageUrl = imageUrl;

               .....
        }
}

我现在需要异步获取图像并将其存储在本地并将路径存储在实体中,或者将 UIImage 存储在实体中。 saving/storing 除了在调用块之后获取正确实体对象的句柄之外不是问题。

我考虑过使用 AFNetworking + UIImage 并添加:

NSURL *url = [[NSURL alloc] initWithString:@"myUrl"]];
[info.image setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];

但是,如果我想存储在本地,我需要使用回调方法this 但我不知道如何获取正确的Entity。

我想做:

__weak Post* weakPost = info;
[info.image setImageWithURLRequest:request placeholderImage:placeholderImage success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

 .... NSString *path = "....save UIIMage and get local path"
   weakPost.imagePath = path;

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
 }];

但是当有多个帖子被迭代时,它没有将它存储在正确的实体中。

有没有人指导正确的方向?

我的建议:不要在回调块中使用对现有实体对象的引用。相反,将实体的标识符传递给块。在块内,您根据标识符从本地数据库检索实体对象,更新其图像 url 并保存。