2013-09-21 70 views
0

我想知道如何以适当的方式做到这一点。 我有NSManagedObject其中包含属性:name,imageUrl,iconUrl。 我使用类别来更新这个对象:Asyc图像与核心数据下载

@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 
    }  
} 

我刷新我的tableView与fetchResultDelegate。

现在我有几个问题。这将是一个正确的方式来获取图像在我的//TODO部分与异步下载?如果我将执行// TODO2代码,fetchResultDelegate是否会通知我图像已设置?或者我应该这样做,它与添加这些managedObject的线程同步。 终于如何停止imageDownload如果应用程序被杀害? 或者我应该在myImageNameWithMD5 setter方法的模型类中进行此下载?

回答

1

我认为真实图像应该从CoreData DataBase分离。 因为你可能永远不会显示用户。

我的方法是,只有在用户即将看到它时才下载图像,并且与第三方SDWebImage这样的聚会框架一起下载时,这可能不会更容易。

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

+0

我在思考解决方案像这样,但问题是我会检查API,如果网址每周更改一次,如果他们这样做,我应该删除旧图像并下载并保存新的图像。 如何用这个框架做到这一点? –

0

这与this类似。

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

我会创建一个“TODO”对象(让我们称之为ImageToDownload)与创建/更新的对象的一对一的关系。
我会创建一个管理器,用于监听这些“TODO”对象的创建,并使用NSOperation s从其下载图像。
创建成功后,您删除“TODO”对象。

这将使你俩取消图像下载当你需要,也是下载请求依然存在,可能会在以后的时间继续进行。

0

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

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

在我代替// TODO的NSManagedObjectCategory我使用这个代码:

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