我想知道如何以正确的方式做到这一点。 我有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方法的模型类中进行下载吗?
答案 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];