2013-09-21 2 views
0

적절한 방법으로이 작업을 수행하는 방법이 궁금합니다. NSManagedObject에 name, imageUrl, iconUrl과 같은 속성이 있습니다. 나는이 개체를 업데이트 할 범주를 사용하고 있습니다 : 나는 fetchResultDelegate 내있는 tableView 상쾌 해요코어 데이터가 포함 된 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 
    }  
} 

.

이제 몇 가지 질문이 있습니다. 비동기 다운로드로 내 // TODO 섹션에서 이미지를 가져 오는 것이 적절한 방법일까요? fetchResultDelegate는 // TODO2 코드를 실행하면 이미지가 설정되었음을 알려줍니까? 또는 해당 managedObject를 추가하는 스레드와 동기화해야합니까? 그리고 마지막으로 앱이 죽으면 imageDownload를 멈추는 방법은 무엇입니까? myImageNameWithMD5 setter 메소드의 모델 클래스에서이 다운로드를 수행해야합니까?

답변

1

실제 이미지는 CoreData DataBase에서 분리되어야한다고 생각합니다. 실제로 사용자를 표시하지 않을 수도 있습니다.

내 접근 방식은 사용자가 보려고 할 때만 이미지를 다운로드하고 SDWebImage과 같은 세 번째 파티 프레임 워크를 사용하면 쉽게 다운로드 할 수 있습니다.

다운로드, 업데이트, 캐시 및 디스플레이를 자동으로 처리합니다.

+0

을 이 문제가 있지만 문제는 URL이 일주일에 한 번 바뀌면 API를 확인하고 이전 이미지를 삭제하고 새 이미지를 저장해야합니다. 이 프레임 워크로 이것을 수행하는 방법? –

0

이것은 this과 유사합니다.

그러나 비동기 작업을 항목 생성과 함께 사용하지 않습니다.

생성 된/업데이트 된 개체와 일대일 관계로 "TODO"개체 (ImageToDownload라고도 함)를 만들 것입니다.
"TODO"개체의 생성을 청취하는 관리자를 만들고 NSOperation을 사용하여 이미지 다운로드를 실행합니다.
성공적으로 생성되면 "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]; 
관련 문제