когда запись массива NSMutable в файл завершена? - PullRequest
0 голосов
/ 11 февраля 2011

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

1 Ответ

2 голосов
/ 11 февраля 2011

Если ваши наборы данных не являются большими, я считаю, что гораздо лучше хранить все данные в памяти, и записывать только на диск в приложении, завершать / в фоновом режиме и читать с диска при запуске приложения.Создайте одноэлементный класс «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
...