Является Ли Кэширование Экземпляров 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 2

2 ответа:

Лично я не стал бы кэшировать основные объекты данных, подобные этому. Основные данные - это ваш кэш. Когда вы также учитываете проблему потоковой передачи (NSManagedObject экземпляры не могут пересечь границу потока), становится еще более рискованным помещать кэш в память поверх основных данных. При этом даже не учитываются проблемы с памятью, которые, при прочих равных условиях, ваш кэш не будет работать так же, как кэш Apple (т. е. основные данные).

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

Я хотел бы сказать, что это не нужно, но я думаю, что это действительно зависит от нескольких факторов.

  • Насколько велик объект Products?
  • является ли запрос / повторный запрос чрезвычайно интенсивным процессором?
  • блокируется ли ваш основной поток?

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

Лучше задать вопрос: Стоит ли вообще использовать основные данные для этого конкретного аспект вашего проекта?

Почему бы не хранить словарь в NSUserDefaults (если ваш has мал)?