0

我想知道如何以正确的方式做到这一点。我有 NSManagedObject,其中包含属性:名称、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 会通知我图像已设置吗?或者我应该与添加这些托管对象的线程同步。最后,如果应用程序被杀死,如何停止 imageDownload?或者我应该在 myImageNameWithMD5 setter 方法的模型类中进行此下载?

4

3 回答 3

1

我认为应该将真实图像与CoreData DataBase. 因为您可能永远不会真正向用户展示。

我的方法是只在用户即将看到图像时才下载图像,并且使用第三方框架,例如SDWebImage,再简单不过了。

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

于 2013-09-21T15:52:46.867 回答
0

这与此类似

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

我将创建一个“TODO”对象(我们称之为 ImageToDownload),它与创建/更新的对象具有一对一的关系。
我将创建一个管理器来监听此类“TODO”对象的创建,并使用NSOperations.
成功创建后,您删除“TODO”对象。

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

于 2013-09-21T16:05:28.163 回答
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];
于 2013-09-21T17:45:40.667 回答