Ошибка NSFileCoordinator при использовании UIManagedDocument в симуляторе iOS 5.0 - PullRequest
1 голос
/ 11 января 2012

Я использую UIManagedDocument в iOS 5.0, запускаю приложение на симуляторе, используя XCode 4.2 под OSX 10.6.Рассматриваемый код выглядит следующим образом:

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.photoDatabase.fileURL path]]) {
    // does not exist on disk, so create it
    [self.photoDatabase saveToURL:self.photoDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        [self setupFetchedResultsController];
        [self fetchFlickrDataIntoDocument:self.photoDatabase];

    }];
} else if (self.photoDatabase.documentState == UIDocumentStateClosed) {
    // exists on disk, but we need to open it
    // *** the following line generates the message ***
    [self.photoDatabase openWithCompletionHandler:^(BOOL success) {
        //[self setupFetchedResultsController];
        }];
} else if (self.photoDatabase.documentState == UIDocumentStateNormal) {
    // already open and ready to use
    [self setupFetchedResultsController];
}

Выполнение отмеченной строки создает следующее сообщение в журнале:

2012-01-10 22:33:17.109 Photomania[5149:4803] NSFileCoordinator: A surprising server error was signaled. Details: Connection invalid

После отправки сообщения UIManagedDocument может или не можетработа - я пока не нашел обстоятельств, которые это определяют.

Я почти уверен, что код правильный, поскольку на самом деле это один из примеров кода в курсе CS193p из Стэнфорда.Весь пример можно скачать на их веб-сайте по адресу http://www.stanford.edu/class/cs193p/cgi-bin/drupal/ Прямая ссылка на код: http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/sample_code/Photomania_0.zip

Кроме того, код работает на самом устройстве нормально, без генерации «удивительного» сообщения,и запуск всего кода, который потом приходит, просто отлично.

Я не нашел ничего ни в Google, ни на страницах Apple Developer.Перезапуск симулятора или XCode, или переустановка их обоих не меняет поведение.

Есть идеи?

Ответы [ 5 ]

1 голос
/ 01 марта 2012

Я могу только сказать, что это случалось со мной несколько раз. Для меня, я ленив после обновления моей модели данных и до сих пор, каждый раз, когда я получал эту ошибку, это было, потому что я изменил свою модель данных. Обычно все, что мне нужно сделать, это удалить мое приложение из симулятора и повторно запустить его, и это всегда получалось хорошо. Надеюсь, это поможет кому-то там.

1 голос
/ 07 марта 2012

Я думаю, что нашел ответ. Похоже, что автоматическое сохранение UIManagedDocument запускается только через несколько секунд на симуляторе.

Поэтому я свернул приложение на симуляторе, нажав кнопку «Домой», а затем щелкнул значок, чтобы снова развернуть его. И тогда я остановил приложение в симуляторе.

Когда я перезапустил приложение, база данных была загружена. Ошибка по-прежнему появляется - это происходит потому, что документ находится в «закрытом» состоянии (это нормально - поэтому CS193P попросил вызвать openWithCompletionHandler), но мои данные при запуске сохраняются. К сожалению, мне нужно выполнить процедуру минимизации / максимизации до завершения работы приложения, иначе изменения будут отменены при следующем запуске.

Можете ли вы проверить, что это поведение, которое вы можете воссоздать? По крайней мере, для целей тестирования это должно быть достаточно хорошим трюком для использования.

0 голосов
/ 10 мая 2012

Все еще были ошибки, когда последний компонент пути для URL файла документа был @ "База данных". Кажется, добавление расширения @ "Database.db" исправило его, теперь все работает нормально. Также были повышены до Lion.

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Database.db"];  
0 голосов
/ 18 апреля 2012

Я люблю Стэнфордский класс iTunes. Тем не менее, я думаю, что пример кода для использования UIManagedDocument является неправильным. На самом деле, он отмечает в демонстрации, что делает это только так, потому что хочет просто получить информацию прямо сейчас. В комментариях к коду он говорит, что не следует использовать функции автосохранения, потому что данные не будут сохранены, если приложение закроется. однако UIManagedDocument сохранит все, что необходимо перед выходом. Он имеет все подходящие обработчики для выхода из / многозадачности / и т.д., чтобы убедиться, что данные сохранены.

Итак, если вы используете этот код в качестве примера, вот версия, которая должна работать и не использует saveToURL (у меня нет учетной записи на flickr, поэтому я на самом деле ее не запускал - но вот как класс рассчитан на работу). Пожалуйста, дайте мне знать, если это не работает.

- (void)fetchFlickrDataIntoDocument:(UIManagedDocument *)document
{
    NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
    ctx.parentContext = document.managedObjectContext;
    [ctx performBlock:^{
        NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos];
        for (NSDictionary *flickrInfo in photos) {
            [Photo photoWithFlickrInfo:flickrInfo inManagedObjectContext:ctx];
            // Push changes to document MOC
            [ctx save:0]; // propagates changes to parent MOC
            // and tell the document it is dirty and needs to be saved
            // It will be saved when the document decides its time to save
            // but it *will* be saved.
            [document updateChangeCount:UIDocumentChangeDone]
        }
    }];
}
0 голосов
/ 19 февраля 2012

Попробуйте обновить iOS до последней версии 5.1.Я не думаю, что UIManagedDocument с iCloud надежно работает в 5.0.Это был мой опыт.

...