コアデータから大きなデータをフェッチするために使用するコアデータバックグラウンドコンテキストがあります。私はデータがフェッチされている間、UIActivityIndicatorViewを表示したい。UIActivityIndicatorViewコアデータバックグラウンドコンテキストフェッチ
私の問題は、フェッチプロセスを開始する前にUIActivityIndicatorViewを起動し、フェッチプロセス後に停止すると、アクティビティインジケータが画面に表示されないということです。だから私は活動のインジケータが表示するのに十分な時間を持っていることを確認するために、バックグラウンドブロックの中に睡眠(10)を含めました。
xcodeの "Debug View Hierarchy"を見て、アクティビティインジケータが読み込まれていることを知っています。アクティビティインジケータがビュー階層の上に表示されています。
これは、コアデータのバックグラウンドコンテキストプロセスで使用する場合にのみ発生します。他のすべてのシナリオでは、アクティビティインジケータが期待どおりに表示されます。
LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")
let backContext = CDStack.shared.backgroundContext
backContext.performBlockAndWait {() -> Void in
print("Fetching parts started ...")
sleep(10)
print("Fetching done!")
}
LoadingOverlay.shared.hideOverlayView()
をバックグラウンド・コンテキストがconcurrencyTypeとNSPersistentStoreCoordinatorを持つ親コンテキストを使用しています:.PrivateQueueConcurrencyType
私は運で次のことを試してみました。ここ
は、私が使用しているコードです。
dispatch_sync(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) {() -> Void in
let backContext = CDStack.shared.backgroundContext
backContext.performBlockAndWait {() -> Void in
dispatch_async(dispatch_get_main_queue()) {() -> Void in
LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")
}
print("Fetching parts started ...")
sleep(10)
print("Fetching done!")
dispatch_async(dispatch_get_main_queue()) {() -> Void in
LoadingOverlay.shared.hideOverlayView()
}
}
}
または以下:
dispatch_async(dispatch_get_main_queue()) {() -> Void in
LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")
}
dispatch_sync(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) {() -> Void in
let backContext = CDStack.shared.backgroundContext
backContext.performBlockAndWait {() -> Void in
print("Fetching parts started ...")
sleep(10)
print("Fetching done!")
}
}
dispatch_async(dispatch_get_main_queue()) {() -> Void in
LoadingOverlay.shared.hideOverlayView()
}
コアデータバックグラウンド・コンテキストの活動で使用した場合ActivityIndicatorViewが表示されていない理由を私は理解していません。助けて?
(10 ) 'はバックグラウンドコード内で遅れて、コードがバックグラウンドで実行されている間にアクティビティインジケータが直ちに解除されているかどうかを確認します。コードが実行されている間、10秒以内に、XCodeの "Debug View Hierarchy"をクリックして、どのビューが階層にあり、バックグラウンドコードの実行が終了する前にアクティビティビューが解除されていないかを確認します。私はあなたの提案をちょうど今試みましたが、それと同じ効果があります。私の問題は、アクティビティビューがバックグラウンドコードの直前に却下されることではありません。 – tew
ああ、私は他の答えがない場合、私は明日の朝に別の顔を見ている:) –