2016-06-16 1 views
0

コアデータから大きなデータをフェッチするために使用するコアデータバックグラウンドコンテキストがあります。私はデータがフェッチされている間、UIActivityIndi​​catorViewを表示したい。UIActivityIndi​​catorViewコアデータバックグラウンドコンテキストフェッチ

私の問題は、フェッチプロセスを開始する前にUIActivityIndi​​catorViewを起動し、フェッチプロセス後に停止すると、アクティビティインジケータが画面に表示されないということです。だから私は活動のインジケータが表示するのに十分な時間を持っていることを確認するために、バックグラウンドブロックの中に睡眠(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() 
} 

コアデータバックグラウンド・コンテキストの活動で使用した場合ActivityIndi​​catorViewが表示されていない理由を私は理解していません。助けて?

答えて

0

例では、アクティビティインジケータを読み込んだり閉じたりするコードがすべてメインスレッド上にあるため、すべてがすぐに実行されます。アクティビティインジケータは、同じ息の中で話すように読み込まれ、閉じられます。メインスレッドは他のスレッドについて知りません。その逆もありますので、例を見て、バックグラウンドコードを完全に無視すれば、私の意味を理解できます。

バックグラウンドコードがその背景ブロックに解雇のコードを追加してください実行が終了した後、活動の指標を却下したいとき、私は「睡眠を追加した理由です

例:

LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...") 

let backContext = CDStack.shared.backgroundContext 

backContext.performBlockAndWait {() -> Void in 
    print("Fetching parts started ...") 

    //fetching code 

    print("fetching done") 

    dispatch_async(dispatch_get_main_queue()) { 
     self.LoadingOverlay.shared.hideOverlayView() 
    } 
} 
+0

(10 ) 'はバックグラウンドコード内で遅れて、コードがバックグラウンドで実行されている間にアクティビティインジケータが直ちに解除されているかどうかを確認します。コードが実行されている間、10秒以内に、XCodeの "Debug View Hierarchy"をクリックして、どのビューが階層にあり、バックグラウンドコードの実行が終了する前にアクティビティビューが解除されていないかを確認します。私はあなたの提案をちょうど今試みましたが、それと同じ効果があります。私の問題は、アクティビティビューがバックグラウンドコードの直前に却下されることではありません。 – tew

+0

ああ、私は他の答えがない場合、私は明日の朝に別の顔を見ている:) –

関連する問題