Как дождаться выполнения UIDocument openWithCompletionHandler?

Я хочу убедиться, что при запуске приложения ничего не происходит, пока UIDocument openWithCompletionHandler: не будет завершен. Дело в том, что openWithCompletionHandler работает в основном потоке, и я считаю, что он должен (?)

В настоящее время я использую асинхронный подход, но это состояние гонки, иногда основные данные инициализируются иногда не тогда, когда загружается мой rootViewController

- (void)useDocument {
    [self setPersistentStoreOptionsInDocument:self.document];

    if(![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
        [self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            self.isReady = YES;
            self.success = success;
        }];
    } else if (self.document.documentState == UIDocumentStateClosed) {
        [self.document openWithCompletionHandler:^(BOOL success) {
            self.isReady = YES;
            self.success = success;
        }];
    } else if (self.document.documentState == UIDocumentStateNormal) {
        self.isReady = YES;
        self.success = YES;
    }
}

заранее спасибо


person Pedro Borges    schedule 07.10.2014    source источник


Ответы (1)


это пример кода, который работает, если быть точным, вам может потребоваться реализовать какой-то другой механизм: 1. Добавьте часы или maxTimes< /em>, чтобы ограничить итерацию.

  1. Перед первым использованием убедитесь, что managedObjectContext равен нулю. Если да, проверьте UIDocumentState следующим образом:

  2. Следует учитывать и другие ***UIDocumentState***, в том числе:

UIDocumentStateClosed (еще не открывал/создавал, подождите немного и повторите попытку) UIDocumentStateSavingError (успех будет НЕТ в обработчике завершения) UIDocumentStateEditingDisabled (временная ситуация, попробуйте еще раз) UIDocumentStateInConflict (например, потому что некоторые другое устройство изменило его через iCloud)

//header file
@interface file2CoredataClass : NSObject{

}
-(void)manualSave;
-(void)manualClose;
-(void)addAllPaths;
@property NSManagedObjectContext *managedObjectContext;
@end

//implementation
@implementation file2CoredataClass
UIManagedDocument *doc;
NSFileManager *fm;
-(id)init{
    self=[super init];
    if(self){
        fm = [NSFileManager defaultManager];
        NSURL *docDirectory = [[fm URLsForDirectory:NSDocumentationDirectory inDomains:NSUserDomainMask] firstObject];
        //notice:for some reason i don't know, the directory may not exist, and you can never create a document in this situation.
        //so, check if directory exists, and if not, create the directory.
        if(![fm fileExistsAtPath:[NSString stringWithFormat:@"%@",docDirectory] isDirectory:&isDir]){
            [fm createDirectoryAtPath:[NSString stringWithFormat:@"%@",docDirectory]  withIntermediateDirectories:YES attributes:nil error:nil];
        }
        NSString *docName = @"geoDoc";
        NSURL *url = [docDirectory URLByAppendingPathComponent:docName];
        doc = [[UIManagedDocument alloc]initWithFileURL:url]; // this creates the UIManagedDocument but not yet open or create the underlying file.
        //open or create the file
        [self openCreateFile:fm documentURL:url];

    }
    return self;
}

-(void)openCreateFile:(NSFileManager *)fm documentURL:(NSURL *)url{
    BOOL fileExists = [fm fileExistsAtPath:[url path]];
    if(fileExists){
        [doc openWithCompletionHandler:^(BOOL success) {
            //block to execute as file operation is asynchronous
            if(!success){
                [self openCreateFile:fm documentURL:url];
            }else if(doc.documentState == UIDocumentStateNormal){
                _managedObjectContext = doc.managedObjectContext;
            }
        }];
    }else{
        [doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            //block to execute as file operation is asynchronous
            if(!success){
                [self openCreateFile:fm documentURL:url];
            }else if(doc.documentState == UIDocumentStateNormal){
                _managedObjectContext = doc.managedObjectContext;
            }
        }];
    }
}
@end
person Charlly Chen    schedule 01.03.2016