1

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

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. Перезапуск симулятора или XCode или переустановка обоих из них не изменяет поведение.

Любые идеи?

+0

Вы поняли что-нибудь для этого? Проект cs193p был только iPhone. Является ли ваш универсальным? Считаете ли вы, что это важно? – LavaSlider

+0

У меня нет, и он работает большую часть времени, поэтому на данный момент он не является высокоприоритетным. Мой собственный проект является универсальным, однако я видел то же самое в проекте cs193p, как скачал с их веб-страницы. – shezi

+0

Обратите внимание, что я не могу проверить это, поскольку я обновил все свои проекты до iOS 5.0, и там ошибка больше не возникает. – shezi

ответ

0

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

1

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

+0

Нет, не помогает мне. знак равно – shezi

1

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

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

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

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

0

I любовь класс Stanford iTunes. Однако, я думаю, что пример кода для использования UIManagedDocument ошибочен. Фактически, он отмечает в демо, что он делает это именно так, потому что он хочет просто получить информацию прямо тогда. В комментариях кода он говорит, что не использовать функции автоматического сохранения, поскольку данные не будут сохранены, если приложение завершится. однако UIManagedDocument будет сохранить все, что необходимо перед выходом. У него есть все подходящие обработчики для выхода/многозадачности/etc, чтобы убедиться, что данные сохранены.

Итак, если вы используете этот код в качестве своего примера, вот версия, которая должна работать, и не использует 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

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

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
url = [url URLByAppendingPathComponent:@"Database.db"]; 

 Смежные вопросы

  • Нет связанных вопросов^_^