ios - 신속하게 작업 결과에 따라보기 전환

출처 ios xcode swift ios8 xcode6

NSURLSession을 사용하여 서버에 요청하고 있습니다. 이를 위해 사용자 지정 완료 핸들러를 사용하여 NSURLSessionTask를 만듭니다.

결과에 따라 다른보기로 전환하고 싶습니다. 그러나 완료 핸들러 내에서이 작업을 수행하면 작동하지 않습니다. 앱이 다음 오류와 함께 충돌합니다.

NSInternalInconsistencyException


전체 오류는 다음과 같이 설명됩니다.

*** Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished], /SourceCache/UIKit_Sim/UIKit-3302.3.1/Keyboard/UIKeyboardTaskQueue.m:374

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'


참고 :보기를 변경하려면 다음 코드를 사용합니다.

let vc: AnyObject! = self.storyboard?.instantiateViewControllerWithIdentifier(viewID)
self.showViewController(vc as UIViewController, sender: vc)


여기서 무엇이 잘못 되었습니까?
주된 문제는 오류 메시지가 "... 주 스레드에서만 호출 될 수 있습니다"라고보고하는 것입니다. 따라서 아마도 백그라운드 스레드 (네트워크 요청에 대한 완료 블록 등) 내에서이 코드를 호출했을 것입니다. 따라서이 코드를 메인 큐로 다시 보내야합니다.
dispatch_async(dispatch_get_main_queue()) {
    let vc = self.storyboard.instantiateViewControllerWithIdentifier(viewID) as UIViewController
    showViewController(vc, sender: self)
}

이 코드 스 니펫은 다음과 같은 몇 가지 사소하고 관련없는 변경을 수행합니다.

대상 뷰 컨트롤러를 자체 보낸 사람으로 지정하는 것은 의미가 없습니다. 일반적으로 현재 뷰 컨트롤러 또는 일부 UIKit 컨트롤을 sender로 사용합니다.
소스 뷰 컨트롤러에서이 작업을 수행했다고 가정하기 때문에 selfsender로 지정했습니다. 또는 이것이 버튼의 IBAction에있는 경우 소스 뷰 컨트롤러 대신 sender 자체의 IBAction 매개 변수를 사용할 수 있습니다.

나는 AnyObject 캐스트를 잃을 것입니다. 나는 컴파일러가 아마 당신에게 그것을 제안했을 것이라는 것을 알고 있지만 코드의 가독성에 도움이되지 않습니다. 직접 UIViewController로 캐스팅하는 것이 좋습니다.
관련 기사

ios - 신속한 iOS에서 텍스트 필드 UI 업데이트

ios - UIView.animateWithDuration 완료

ios - Swift에서 Core Data로부터받은 배열 정렬

ios - UIcollectionview에서 특정 셀에 대한 참조 가져 오기

ios - SWIFT-xcode 6 베타 6.의 KVO. observeValueForKeyPath가 더 이상 호출되지 않습니다.

ios - iOS8에서 VFR-Reader 충돌

ios - iOS 8 확장의 TBXML이 빌드되지 않음

ios - 사진을 찍고 카메라 롤에 저장

ios - iOS 사용자 정의 UITableViewCell 클래스 하위보기가 null을 반환합니다.

ios - NSString에서 중복 된 단어를 제거하고 새 NSString으로 저장