UIDocument openWithCompletionHandler не завершается на устройстве iOS

Я пытаюсь открыть управляемый документ, используя openWithCompletionHandler:

Проблема, с которой я сталкиваюсь, заключается в том, что он отлично работает на симуляторе, но когда я тестирую его на своем iPhone 4, обработчик завершения никогда не завершается. Код выглядит следующим образом:

[theManagedDocument openWithCompletionHandler:^(BOOL success){
    if(success) [self documentIsReady];
    if(!success) NSLog(@"Couldn't Open Document");
}];

Это отлично работает на симуляторе, и я получаю вызов documentIsReady (или «Не удалось открыть документ», если возникают ошибки). Но на iPhone 4 он никогда не запускает блок CompletionHandler. Я поставил точки останова по всему блоку (до и после обоих операторов if), и ничего не вызывается. Нет сообщения «Не удалось открыть документ» на консоли, нет вызова documentIsReady.

Я также должен упомянуть, что кажется, что при первом запуске приложения на iPhone оно будет работать правильно. Я также инкапсулировал это в операторе if с вызовом fileExistsAtPath:. Он прекрасно проникает внутрь оператора if и вызывает openWithCompletionHandler:, но блок завершения никогда не срабатывает.

Я использую iOS 5.1 и Xcode 4.3.2.


person Justin Paulson    schedule 12.04.2012    source источник


Ответы (5)


В моем случае выключение iPad и его перезагрузка «решили» эту проблему. Удачи!

person Dave Ross    schedule 24.04.2012
comment
Я очистил приложение, перезапустил все, и, кажется, стало лучше. Немного больше работы, чем этот ответ, но это достаточно близко. Все еще не уверен, что было причиной этого. - person Justin Paulson; 23.06.2012
comment
Удивительно, как часто перезагрузка устройства исправляет ошибки. - person Anton; 01.03.2013

Я столкнулся с той же проблемой в своих приложениях, которые используют iCloud для обмена данными. Я понял, что openWithCompletionHandler: просто ждет и никогда не вызывает обработчик завершения, если документ остается открытым приостановленным приложением. Если это так, вы должны убедиться, что вы закрываете документ, когда ваше приложение переходит в фоновый режим.

person murat    schedule 25.05.2012
comment
Я также столкнулся с практически таким же поведением, если забыл освободить свой собственный экземпляр класса UIDocument из обработчика завершения. Он просто остается открытым и зависает при второй попытке вызвать openWithCompletionHandler. - person vargonian; 29.07.2012
comment
@vargonian Это имело бы смысл ... за исключением того, что эта проблема также возникает с ARC (который обрабатывает память). - person Sam Spencer; 28.11.2013

Попробуйте проверить, что theManagedDocument != nil перед вызовом - это единственная причина, по которой я могу придумать, почему блок не будет выполнен.

person Nick Lockwood    schedule 16.04.2012

Другая причина, по которой success может быть ложной, заключается в том, что вы изменили свою модель (например, добавили свойство к объекту), но не удалили приложение из симулятора/устройства, чтобы обновить модель.

person damian    schedule 25.02.2013
comment
возможно, но я не считал success ложным. Мне вообще ничего не вернули. - person Justin Paulson; 26.02.2013

Для меня это было потому, что я вызывал openWithCompletionHandler: в фоновом потоке. Изменение его для вызова из основного потока устранило зависание

dispatch_async(dispatch_get_main_queue(), ^{
    ...
    [document openWithCompletionHandler:^(BOOL success) {
        ...
    }];
});        
person Mark Mc    schedule 14.08.2020