Я использую подкласс UIManagedDocument
для использования Core Data в моем проекте. Дело в том, что подкласс возвращает экземпляр singleton, чтобы мои экраны могли просто вызвать его, а контекст управляемого объекта остался прежним для всех из них.
Перед использованием UIManagedDocument
мне нужно подготовить его, открыв его, если его путь к файлу уже существует, или создав его, если он еще не создан. Я создал удобный метод prepareWithCompletionHandler:
в подклассе для облегчения обоих сценариев.
@implementation SPRManagedDocument
// Singleton class method here. Then...
- (void)prepareWithCompletionHandler:(void (^)(BOOL))completionHandler
{
__block BOOL successful;
// _exists simply checks if the document exists at the given file path.
if (self.exists) {
[self openWithCompletionHandler:^(BOOL success) {
successful = success;
if (success) {
if (self.documentState != UIDocumentStateNormal) {
successful = NO;
}
}
completionHandler(successful);
}];
} else {
[self saveToURL:self.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
successful = success;
if (success) {
if (self.documentState != UIDocumentStateNormal) {
successful = NO;
}
}
completionHandler(successful);
}];
}
}
@end
То, что я пытаюсь сделать, это вызвать этот метод подготовки в своем делетете приложения didFinishLaunchingWithOptions
и дождаться завершения блока завершения, прежде чем возвращать либо YES
, либо NO
в конце. Мой текущий подход не работает.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
__block BOOL successful;
SPRManagedDocument *document = [SPRManagedDocument sharedDocument];
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[document prepareWithCompletionHandler:^(BOOL success) {
successful = success;
}];
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
});
return successful;
}
Как я могу подождать, пока обработчик завершения в prepareWithCompletionHandler
не будет вызван, прежде чем возвращать successful
? Я действительно смущен.