2016-06-02 14 views
1

저는 Swift (2.2)의 신참이며 Xcode 7.3 및 OS X 10.11을 사용하는 간단한 응용 프로그램에 문제가 있습니다. 이 응용 프로그램에서는 사용자가 버튼을 클릭하고 NSOpenPanel을 통해 파일을 선택합니다. 코드는 선택한 URL을 사용하여 파일의 데이터와 이름을 가져온 다음 데이터를 처리하고 그 결과를 다른 위치에 저장합니다. 대용량 파일의 경우 처리하는 데 몇 초가 걸릴 수 있습니다. 대용량 파일을 처리 할 때 파일을 선택하면 열린 파일 창이 비어 있던 공간이 비워져서 응용 프로그램보기와 그 밖의 모든 항목을 덮고 작업이 완료 될 때까지 그대로 있습니다. 또한 작업이 끝날 때까지 앱의 아웃렛이 고정됩니다. 그것은 NSOpenPanel 다시 응용 프로그램 및 시스템 창 제어를 넘겨 나타납니다 나타납니다.Swift 기능 중에는 NSOpenPanel이 제대로 닫히지 않습니다.

코드는 다음과 같이 진행됩니다

@IBAction func processFile(sender: AnyObject) { 
    var chosenURL: NSURL? 
    let openPanel = NSOpenPanel() 
    openPanel.title = "Choose a file" 
    openPanel.canChooseDirectories = false 
    openPanel.allowsMultipleSelection = false 

    if openPanel.runModal() == NSFileHandlingPanelOKButton { 
      chosenURL = openPanel.URL 
    } 
    let dataBytes = NSData(contentsOfURL: chosenURL!) 
    let fileName = chosenURL!.lastPathCompnent! 
    // Remaining code processes dataBytes and fileName 

나는 몇 가지 변화를 시도했지만 같은 결과를 얻을했습니다. "NSOpenPanel이 닫히지 않을 것입니다"를 검색하면 일반적으로 Objective-C에 예제가 표시됩니다. NSOpenPanel을 종료하고 뷰와 컨트롤을 응용 프로그램 창으로 반환하는 방법에 대한 제안 사항은 무엇입니까?

+0

NSData (contentsOfURL : selectedURL!) 이것은 UI를 차단하는 것입니다. 백그라운드에서 데이터를 가져와야합니다. – Moritz

+0

그게 무슨 뜻인지 모르겠습니다. GCD와 관련이 있습니까? – Micos

답변

1

에릭 디의 제안에 이어 그랜드 센트럴 디스패치와 백그라운드 프로세스를 살펴 보았습니다. 첫 번째 접근 방식은 다음과 같습니다.

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) { 
dataBytes = NSData(contentsOfURL: chosenURL!) 
} 

아무 것도 변경되지 않았습니다. UI 업데이트와 관련하여 'dispatch_async (dispatch_get_main_queue())'문을 사용하여 디스패치 클로저 내에서 나머지 모든 프로세스 ('let dataBytes ...'부터 모든 것)를 처리해야한다는 것을 알았습니다. 이로 인해 창문이 멈추어 블랭킹이되지 않아 앱에 제어권을 넘겼습니다. 다시 한번 감사드립니다, Eric.