проверка целостности данных iphone - PullRequest
0 голосов
/ 21 августа 2009

Что ж, я пытаюсь решить, является ли способ, которым я выбрал сохранение веб-данных, правильным способом в моем приложении для iPhone.

Я еще не разбирался в тонкостях Core Data, поэтому все еще использую Sqlite с оболочкой FMDB.

Вот как я это делаю сейчас:

У меня есть класс, который использует синглтон, подобный примеру Element. Создается статический общий экземпляр, который используется двумя или более представлениями. Данные загружаются и загружаются в массив этого класса. Я храню загрузки в Sqlite. Я загружаю Sqlite сохраненные данные при инициализации и получаю любые обновления из Интернета за временную метку.

Я делаю это "правильным" способом? Это выглядит правильно?

Вот какой-то псевдокод, сильно вырезанный для краткости.

@implementation theClass
static theClass *sharedInstance = nil;
...
- (void)requestDone:(Request *)request
{
    NSDictionary *results=[[request responseString] JSONValue];
    [self._array removeAllObjects];
    [self._array addObjectsFromArray:results];
    [self updateDatabase]; //stores any new results
    [[NSUserDefaults standardUserDefaults] setObject:self.lastUpdated forKey:@"LastAccessed"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self didFinish];
}
-(void)setupArray {
    self._array=[NSMutableArray array];
    ...
}
...
-(void)getUpdates {
    NSURL *jsonURL = [NSURL URLWithString:@"URL TO THE WEBDATA"];
    request = NSURLRequst....
}
- init {
    if (self = [super init]) {
        [self setupArray];
    }
    return self;
}

+ (theClass *)shared {
    @synchronized(self) {
        if (sharedInstance == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];
            return sharedInstance;  // assignment and return on first allocation
        }
    }
    return nil; //on subsequent allocation attempts return nil
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)retain {
    return self;
}

- (unsigned)retainCount {
    return UINT_MAX;}

- (void)release {
    //do nothing
}

- (id)autorelease {
    return self;
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2009

Я на самом деле просто использую список NSUserDefaults для привязки только последнего обновленного времени (в случае, если оно мне нужно). Я храню все в БД sqlite ([self updateDatabase]).

Чтобы проверить наличие файла:

NSString *fullPath = [[[NSBundle mainBundle]bundlePath] stringByAppendingPathComponent:@"filenamehere"];
//--or--
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filenamehere];

if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) ...

Удалить:

[fileManager removeItemAtPath:pathtofile error:NULL];

Полагаю, ваш вопрос - тот, который у меня был (несколько). Мне было интересно, должен ли класс singleton обрабатывать доступ к постоянному хранилищу данных, когда к данным обращаются через несколько контроллеров представления в приложении. Я просто застрял с дизайном, так как он хорошо работает для моего приложения (хотя в очень больших приложениях я мог видеть проблемы с памятью, я думаю). Поэтому я полагаю, что ответил на свой вопрос.

0 голосов
/ 19 сентября 2009

Я смотрю на ту же проблему и пришел к выводу, что NSUserDefaults предназначен для небольших наборов данных, то есть для настроек и, возможно, состояния, но не для данных состояния. Большие значения данных или данные, которые я смотрю, сохраняются в файле с помощью [NSArray writeToFile] и считываются с помощью [NSArray initFromFile].

Вы должны запросить путь, назначенный вашему приложению, и добавить свое имя файла. То, что я еще не изучил, это как проверить наличие файла, как удалить (или некоторые другие средства очистки / сброса).

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

Кстати, какова цель синглтона? Вы уже владеете всеми потоками, и никакой другой процесс (приложение) не может получить доступ к вашей песочнице, поэтому вы должны иметь возможность использовать семафоры (мьютекс). Мой вопрос не является проблемой, он помогает мне понять, какие шаблоны полезны в iPhone.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...