2017-07-30 7 views
0

、この方法は、以下の記述があります。NSPersistentContainerのloadPersistentStoresのcompletionHandlerは同期して実行されますか? <strong>NSPersistentContainer</strong>のAppleのドキュメントで

func loadPersistentStores(completionHandler block: @escaping (NSPersistentStoreDescription, Error?) -> Void) 


block: Once the loading of the persistent stores has completed, this block will be executed on the calling thread. 

をしかし、スタックトレースをデバッグするのに何回した後、私はcompletionHandlerを同期的に実行されていることを確信しています。 loadPersistentStoresを呼び出した後にprintステートメントを置くと、completionHandlerが実行された後に常に印刷されます。 loadPersistentStores戻り、NSPersistentContainerが既に(成功したかどうか)にロードされたときに

だから、私は考える必要がありますか?

答えて

4

これは私が見つけることができるところではっきりとは説明されていませんが、ドキュメンテーションを調べるといくつかの回答が得られます。

最初に、NSPersistentStoreDescriptionには、shouldAddStoreAsynchronouslyと呼ばれるフラグがあります。デフォルトはfalseです。フラグを設定するためにコンテナの説明を変更しないと、それらは同期してロードされます。それはあなたが見たものと一致します。

これは、永続的なコンテナオプションでは特に記述されていないと思います。しかし、WWDC 2016 "What's New in Core Data"セッションではNSPersistentStoreCoordinatorのコンテキストで同じことが説明され、新しい(iOS 10以降の)メソッドaddPersistentStore(with:completionHandler:)が使用されています。 async loadフラグを使用すると、ロードは非同期で行われます。そうしないと、今までの唯一のオプションであったデフォルトの同期ロードが得られます。

これに基づいて、私はあなたが見ているものが正しいと思います。非同期であるべきことを指示しない限り、読み込みは同期します。 shouldAddStoreAsynchronouslytrueに設定すると、異なる動作が予想されます。同期ロードでは、完了ブロックはエラーが報告される場所であるため、まだ有効です。

を複数追加すると、loadPersistentStoresは複数のストアを読み込む可能性があります。その場合、完了ブロックは複数回呼び出されることがあります。

関連する問題