Как вы обрабатываете UIManagedDocument? - PullRequest
3 голосов
/ 31 января 2012

Прежде всего, я должен отметить, что это мой первый пост на этом сайте.Я пытаюсь научить себя программировать iOS, и в моих поисках ответов в Google я обнаружил, что меня постоянно направляют сюда.Так что спасибо всем, кто внес свой вклад здесь.Вы уже помогли мне много.

Я прошел класс Stanford CS193P и ЛЮБЛЮ его.Но я застрял прямо сейчас и не уверен, куда обратиться.

Моя проблема была с UIManagedDocument.

Я устал делать простое приложение, чтобы проверить свои новые навыки.Вот что он делает:

Простое бухгалтерское приложение, которое отслеживает отдельные вклады в мероприятие по сбору средств.

У меня есть UITabBar, который на каждой вкладке позволяет: 1. Отслеживать участников (игроков) - Это позволит подключиться к адресной книге и позволит вам добавить их или просто сохранить их в этом приложении.2. Управление событиями (событиями). Вы можете добавлять, редактировать или удалять события, к которым затем будете добавлять участников, а затем сможете добавлять то, что они принесли (Банк) в это событие.3. Настройки.- Я добавил несколько кнопок, чтобы помочь мне разобраться во всем, включая кнопку сброса, которая очищает все данные, и кнопку «фиктивных данных».

У меня есть три объекта coreData.Игроки, события и банк имеют отношения с двумя другими.

Когда я впервые попытался создать это приложение (до iOS5), я использовал appDelegate, чтобы создать свой ManagedObjectContext и передать его моим viewControllers.Это сработало.Но теперь я должен использовать UIManagedObjectDocument и не использовать AppDelegate.Я верю, что понимаю принцип и интеграцию с iCloud.(Я могу ошибаться)

Используя примеры из класса и то, что я мог найти в Интернете, я создал вспомогательный класс, который будет предоставлять первый из каждого из моих ViewControllers в моих UINavigationControllers - ManagedDocument.

+ (UIManagedDocument *)sharedManagedDocument
{
    static UIManagedDocument *sharedDocument = nil;

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"];
    // url is "<Documents Directory>/<DefaultAppDatabase>"

    // Create the shared instance lazily upon the first request.
    if (sharedDocument == nil) {
        sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    if (sharedDocument.fileURL != url) {
        UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url];
        sharedDocument = newDocument;
    }

    NSLog(@"SharedDocument: %@", sharedDocument);

    return sharedDocument;
}

Затем первый ViewController открывал документ и выполнял выборку.

Оттуда я передаю все, что выбрано NSManagedObject, следующему ViewController через ход.

Проблемы возникают, когда я добавляю или сбрасываю данные.(Я предполагаю, что если я смогу заставить его работать с кнопкой «фиктивные данные», я смогу заставить его работать с отдельной записью) Когда я нажимаю кнопку «Сброс» или «Фиктивный», мои журналы говорят мне, что это былонажал, но я не вижу никаких изменений в данных, пока я не перезапущу приложение.Тогда это обнаруживается отлично.Я думаю, что я не сохраняю файл правильно, или я не обновляю tableViews правильно.Я предпринял небольшую попытку использовать NSNotification, но не стал вдаваться в подробности, так как не мог заставить его реагировать ни на что.Я рад вернуться по этому пути, если мне нужно.

Это мой метод сохранения ... в значительной степени только что скопированный из стандартного coreData appDelegate.

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }

    [self.appDatabase saveToURL:self.appDatabase.fileURL
               forSaveOperation:UIDocumentSaveForOverwriting
              completionHandler:^(BOOL success){
                  if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName);
                  if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName);
              }];

}

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

Большое спасибо за любую помощь или за указание на меняправильное направление, чтобы сделать больше исследований.Извините, этот пост такой длинный, я старался быть как можно яснее.

1 Ответ

2 голосов
/ 13 февраля 2012

Я перебрал все это. Алан отлично задал мой вопрос в этом посте:

Как создать глобальный экземпляр UIManagedDocument для каждого документа на диске, который используется всеми приложениями с помощью блоков?

Вопрос и ответы все прояснили.

Спасибо

...