2016-06-16 4 views
0

핵심 데이터에서 큰 데이터를 가져 오는 데 사용하는 핵심 데이터 배경 컨텍스트가 있습니다. 데이터를 가져 오는 동안 UIActivityIndicatorView를 표시하려고합니다.UIActivityIndicatorView 핵심 데이터 백그라운드 컨텍스트 가져 오기

내 문제는 가져 오기 프로세스를 시작하기 전에 UIActivityIndicatorView를 시작하고 가져 오기 프로세스가 끝난 후 중지하면 내선 표시기가 화면에 나타나지 않는다는 것입니다. 그래서 활동 표시기에 표시 할 충분한 시간이 있는지 확인하기 위해 백그라운드 블록 안에 sleep (10)을 포함 시켰습니다. 표시되지 않습니다.

"xcode"의 "Debug View Hierarchy"를보고 활동 표시기가로드되고 있다는 것을 알고 있는데, 활동 표시기가 맨 위에있는 뷰 계층 구조에 있음을 보여줍니다.

이것은 핵심 데이터 백그라운드 컨텍스트 프로세스에서 사용할 때만 발생합니다. 다른 모든 시나리오에서는 예상대로 활동 표시기가 표시됩니다.

.PrivateQueueConcurrencyType

나는 행운과 함께 다음과 같은 시도 :

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이있는 부모 컨텍스트를 사용하여 여기에

내가 사용하고 코드입니다.

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가 표시되지 않는 이유를 이해하지 않습니다. 도움?

답변

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

아, 다른 답변이 없다면 내일 아침에 다른 모양을 보게 될 것입니다. :) –

관련 문제