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