Является Ли Кэширование Экземпляров NSMangagedObject Плохой Идеей?
У меня есть основная сущность данных, называемая продуктом, которая изначально заполняется, когда пользователь впервые входит в приложение. Затем он может быть загружен снова, если пользователь запрашивает обновление.
Сущность продукта запрашивается в нескольких местах приложения. Поэтому я решил реализовать простой кэш, который можно использовать совместно в приложении. В кэше хранится продукт NSManagedObjects в карте. Разве это плохая идея?
Класс ProductCache:
@interface ProductCache ()
@end
@implementation ProductCache {
}
static NSDictionary *productsDictionary = nil;
static ProductCache *sharedInstance;
+ (ProductCache *)sharedInstance {
@synchronized (self) {
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
[sharedInstance reload];
}
}
return sharedInstance;
}
- (void) reload{
NSMutableDictionary *productsMap = [[NSMutableDictionary alloc] init];
CIAppDelegate *delegate = (CIAppDelegate *) [UIApplication sharedApplication].delegate;
NSManagedObjectContext *managedObjectContext = delegate.managedObjectContext;
NSArray *allProducts = [CoreDataManager getProducts:managedObjectContext];
for (Product *product in allProducts) {
[productsMap setObject:product forKey:product.productId];
}
productsDictionary = productsMap;
}
- (NSArray *)allProducts{
return [productsDictionary allValues];
}
- (Product *) productForId:(NSNumber *)productId {
return productId ? [productsDictionary objectForKey:productId] : nil;
}
@end
2 ответа:
Лично я не стал бы кэшировать основные объекты данных, подобные этому. Основные данные - это ваш кэш. Когда вы также учитываете проблему потоковой передачи (
NSManagedObject
экземпляры не могут пересечь границу потока), становится еще более рискованным помещать кэш в память поверх основных данных. При этом даже не учитываются проблемы с памятью, которые, при прочих равных условиях, ваш кэш не будет работать так же, как кэш Apple (т. е. основные данные).Если вам нужен мгновенный доступ (против наносекундный доступ на диске) к вашим основным объектам данных, затем рассмотрите возможность копирования вашего кэша на диске в кэш в памяти, а затем получите к нему доступ. Однако, если время доступа наносекунды достаточно, оставьте его в основных данных и извлеките сущности, когда они вам понадобятся. Создайте удобные методы для выборки, если вы находите ее повторяющейся, но не помещаете кэш сверху.
Я хотел бы сказать, что это не нужно, но я думаю, что это действительно зависит от нескольких факторов.
- Насколько велик объект Products?
- является ли запрос / повторный запрос чрезвычайно интенсивным процессором?
- блокируется ли ваш основной поток?
Лично я думаю, что вы могли бы избежать кэширования и просто повторно запросить объект Products в фоновом потоке, когда вам это нужно.
Лучше задать вопрос: Стоит ли вообще использовать основные данные для этого конкретного аспект вашего проекта?
Почему бы не хранить словарь в NSUserDefaults (если ваш has мал)?