Asyc图像下载与核心数据

时间:2013-09-21 15:37:32

标签: ios core-data asynchronous

我想知道如何以正确的方式做到这一点。 我有NSManagedObject,其中包含属性:name,imageUrl,iconUrl。 我正在使用类别来更新此对象:

@implementation MyObject (Create)
+ (instancetype)findOrCreateWithIdentifier:(id)identifier inContext:(NSManagedObjectContext*)context {
    NSString* entityName = NSStringFromClass(self);
    NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name = %@", identifier];
    fetchRequest.fetchLimit = 1;
    id object = [[context executeFetchRequest:fetchRequest error:NULL] lastObject];
    if(object == nil) {
        object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
    }
    return object;
}

+ (void)createWithJSONComponents:(NSDictionary*)components intoContext:(NSManagedObjectContext*)context
{
    NSString* name = components[@"name"];
    NSString* imageUrl = components[@"image"];
    NSString* iconUrl = components[@"icon"];

    MyObject* myObject = [self findOrCreateWithIdentifier:myObject inContext:context];

    if(!myObject.name)
    {
        myObject.name = name;
    }

    if(![imageUrl isEqualToString:myObject.imageURL]
       || !myObject.imageURL )
    {
        myObject.imageURL = imageUrl;
        //TODO remove old image and get new one
        //TODO2 in block callback after download myImageNameWithMD5 = imageNameWithMD5
    }

    if(![iconUrl isEqualToString:myObject.iconUrl]
       || !myObject.iconUrl)
    {
        myObject.iconUrl = imageUrl;
        //TODO remove old image and get new one
        //TODO2 in block callback after download myImageNameWithMD5 = imageNameWithMD5
    }    
}

我用fetchResultDelegate刷新了我的tableView。

现在我几乎没有问题。使用异步下载在我的// TODO部分获取图像是否正确?如果我将执行// TODO2代码,fetchResultDelegate会告诉我图像是否已设置?或者我应该与添加那些managedObject的线程同步。 最后如果app被杀,如何停止imageDownload? 或者我应该在myImageNameWithMD5 setter方法的模型类中进行下载吗?

3 个答案:

答案 0 :(得分:1)

我认为真实的图像应该与CoreData DataBase分开。 因为你可能永远不会真正展示用户。

我的方法是只在用户即将看到它时才下载图像,并且只有第三个 像SDWebImage这样的派对框架,这可不容易。

它自动处理下载,更新,缓存和显示。

答案 1 :(得分:0)

这与this类似。

但是,我不会将异步操作与项目创建混合。

我会创建一个“TODO”对象(让我们称之为ImageToDownload),它与创建/更新的对象具有一对一的关系。
我会创建一个管理员,听取这些“TODO”对象的创建,并使用NSOperation s从它发出图像下载。
成功创建时删除“TODO”对象。

这将允许您在需要时取消图像下载,并且下载请求仍然存在,可能会在以后继续。

答案 2 :(得分:0)

好的,我找到了最好的解决方案(感谢@Kyle Fang) 我正在使用SDWebImage Framework。在我用我使用的数据填充我的UIView的地方

    [view.iconImageView setImageWithURL:[NSURL URLWithString:item.iconUrl]
                       placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

在我的NSManagedObjectCategory中代替// TODO我正在使用此代码:

    [[SDImageCache sharedImageCache] removeImageForKey:myObject.iconUrl];