когда запись массива NSMutable в файл завершена?

Я работаю над своим первым приложением для iPhone. Мой интерфейс состоит из 4 вкладок. Первая вкладка показывает активные проекты. Последняя вкладка — это вкладка «Настройки», где пользователь может включать и выключать проекты. На вкладке настроек есть NSMutableArray проектов (полученных из вызова веб-сервисов), и я записываю их в файл в папке «Документы» для приложения. Первая вкладка считывает проекты из файла, восстанавливая файл в NSMutableArray и показывая только проекты с битом IsActive, установленным в значение true. Все работает, за исключением случаев, когда я отключаю статус проекта на вкладке настроек, а затем сразу нажимаю на первую вкладку. Первая вкладка не отражает изменения, сделанные на вкладке настроек. Однако, если я нажму на одну из других вкладок перед переходом на первую вкладку, то первая вкладка соответствующим образом отобразит изменения, внесенные на вкладке настроек. Единственное, о чем я могу думать, это то, что файл не закончил запись в папку «Документы» при переходе непосредственно с вкладки настроек на первую вкладку. Я пишу NSMutableArray в событии ViewDidDisapper для вкладки Settings. Что мне не хватает? Спасибо за вашу помощь.


person Tom Schreck    schedule 11.02.2011    source источник
comment
куда вы загружаете сохраненный массив на первой вкладке? viewDidLoad не будет подходящим местом.   -  person Felix    schedule 11.02.2011


Ответы (1)


Если ваши наборы данных не велики, я считаю, что гораздо лучше хранить все данные в памяти и записывать на диск только при завершении приложения/в фоновом режиме и читать с диска при запуске приложения. Создайте одноэлементный класс FooManager для хранения данных, необходимых в разных частях вашего приложения, и получите доступ к данным через API одноэлементного класса. Я думаю, что это намного чище, чем отвешивать все от ProjectAppDelegate. Это также должно решить ваше состояние гонки записи/чтения.

РЕДАКТИРОВАТЬ: вот крошечный класс диспетчера кеша одноэлементных сетевых изображений, который я использую в текущем проекте. Иногда пример стоит тысячи слов туториалов :). Чтобы использовать этот класс в любом коде, просто #import заголовок и выполните:

NetworkImageCacheManager *nicm = [NetworkImageCacheManager sharedInstance];
UIImage *img = [nicm imageWithURL:imageURL];

Вот код для этого класса:

#import <Foundation/Foundation.h>


@interface NetworkImageCacheManager : NSObject 
{
    NSMutableDictionary *imgCache;
}

@property (nonatomic, retain) NSMutableDictionary *imgCache;

+ (NetworkImageCacheManager *) sharedInstance;
- (UIImage *) imageWithURLString:(NSString *)imgURLString;
- (void) setImage:(UIImage *)theImage forURLString:(NSString *)imgURLString;

@end


@implementation NetworkImageCacheManager
@synthesize imgCache;

- (id) init
{
    self = [super init];
    if ( self ) 
    {
        self.imgCache = [NSMutableDictionary dictionary];
    }

    return self;
}


+ (NetworkImageCacheManager *) sharedInstance
{
    static NetworkImageCacheManager *g_instance = nil;

    if ( g_instance == nil )
    {
        g_instance = [[self alloc] init];
    }

    return g_instance;
}


- (UIImage *) imageWithURLString:(NSString *)imgURLString
{
    UIImage *rv = [self.imgCache objectForKey:imgURLString];
    return rv;
}

- (void) setImage:(UIImage *)theImage forURLString:(NSString *)imgURLString
{
    [self.imgCache setObject:theImage forKey:imgURLString];
}

- (void) dealloc
{
    [imgCache release];
    [super dealloc];
}




@end
person Bogatyr    schedule 11.02.2011
comment
Я согласен. Я не вижу особой пользы в записи на диск в этом случае. Это только усложняет ситуацию и приводит к проблемам, подобным той, которую вы описываете. - person raidfive; 11.02.2011
comment
Я рассмотрю этот подход. Можете ли вы порекомендовать какие-либо учебники? Спасибо за ваше время. - person Tom Schreck; 11.02.2011