2013-09-02 2 views
1

Я сохраняю большие объекты на диске, которые отвечают на протокол NSCoding. Я хотел бы ленить загружать переменные экземпляра объекта по запросу, и мне интересно, можно ли всегда читать объект с диска (тестирование не обязательно ответит на этот вопрос). Я не могу использовать Core Data в своем приложении, так что это не вариант.Возможно ли использовать ленивый объект нагрузки, соответствующий протоколу nscoding

Прецедент сценарий

Например

@interface AClassWhichCreatesObjectsWithLotsOfData <NSCoding> 

-(UIImage *)getImage1; // could be a huge image 
-(UIImage *)getImage2; // another huge image 
... 

@end 

@implementation AClassWhichCreatesObjectsWithLotsOfData 

// serializing the object 
-(void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    //encode object to write to disk 
} 

// would like to store the "aDecoder" and load the images lazilly 
-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    // Can I Lazy Load this objects data according to aDecoder ? 
    self.myDecoder = aDecoder //store the decoder - will aDecoder ever invalidate? 
} 

-(UIImage *)getImage1 // lazy load the image 
{ 
    if (self.myDecoder != nil && self.image1 == nil) 
    { 
     return [self.myDecoder decodeObjectForKey:@"image1"]; 
    } else { 
     return self.image1; 
    } 
} 

@end 


// thousands of objects are stored in this collection 
    @interface DiskBackedDictionary : NSObject // if this was in memory app would crash because of memory usage 

    -(void)setObject:(id<NSCoding>)object forKey:(NSString *)aKey 
    -(id)objectForKey:(NSString *)key; 
    @end 

    @implementation DiskBackedDictionary 

    -(void)setObject(id<NSCoding>)object forKey:(NSString *)akey 
    { 
     // write the object to disk according to aKey 
    } 

    -(id)objectForKey:(NSString *)aKey 
    { 
     // return a lazy loaded object according to a key 
    } 
    @end 

ответ

2

Вместо того, чтобы ругать систему, вы должны немного подправить свой дизайн, чтобы лучше поддерживать ваши требования. Вместо того, чтобы архивировать весь объект как один элемент и включать изображение, посмотрите на сохранение изображений в виде отдельных файлов и архивирование объекта с помощью путей к этим изображениям. Теперь, когда объект воссоздан, вы можете правильно и полностью перезагрузить экземпляр, а затем можете ленить загружать изображения со своих путей, когда это необходимо.

+0

Вот что я в итоге сделал –

Смежные вопросы