2017-04-26 4 views
2

를 사용 하는가?언제가 UI에 대한 업데이트는 다음 구문을 사용하여 메인 큐 내에서 실행해야합니다 알고 주요 큐

let nav = self.navigationController?.navigationBar 
    nav?.barStyle = UIBarStyle.Default 
    nav?.tintColor = UIColor.blackColor() 
    nav?.barTintColor = UIColor(red:133.0/255, green:182.0/255, blue:189.0/255, alpha:1.0) 

    let toolBar = self.navigationController?.toolbar 
    toolBar?.barTintColor = UIColor(red:231/255, green:111/255, blue:19.0/255, alpha:1.0) 
    toolBar?.tintColor = UIColor.blackColor() 

내가뿐만 아니라 주요 큐 내부에이 코드를 포장해야 내있는 viewDidLoad에서

() 나는 아래처럼 메뉴 바 및 툴바를 양식에 일치하는 코드가?

내 tableView cellForRowAtIndexPath 함수에서 주 큐의 각 테이블 셀 UI를 설정하는 코드를 모두 래핑해야합니까? 나는 새로운 모달 컨트롤러를 발표 할 때

이 (self.presentViewController (modalController가, 애니메이션 : 사실, 완료 : 무기 호), I 메인 큐 안에이 포장해야

답변

5

대답을 모든 질문은 "아니오"이다 설명서에 명시하지 않는 한

, 모든 UIKit 기능은 메인 큐에 호출됩니다. 일반적으로

, 특별히에 실행 완료 핸들러와 비동기 FUNC를 호출 한 후 메인 큐에서 실행해야합니다 배경 대기열 같은 것 ...

// downloadImage is some func where the 
// completion handler runs on a background queue 
downloadImage(completion: { image in 
    DispatchQueue.main.async { 
     self.imageView.image = image 
    } 
}) 
+0

정말 고마워요! – JK140

+0

@ JK140 -이 질문에 대한 답변이 있으면 [이 대답 수락] (http://stackoverflow.com/help/someone-answers)을 읽어야합니다. – Rob

+0

메인 큐에 UIKit 함수를 랩핑하면 성능에 영향을 미치거나 다른 영향이 있습니까? – JK140

1

그래, 메인 대기열을 호출하는 것은 백그라운드 대기열에서 비동기 적으로 이미 기능이 수행되고 있다면해야 할 일입니다. 그리고 그 자체로 일어나는 경향이 없습니다.

애쉴리 (Ashley)와 마찬가지로 UIKit 메서드는 메인 큐에서 자동으로 호출됩니다. 따라서 일부 프레임 워크에는 백그라운드 대기열에서 자동으로 호출하는 메서드가있는 것이 타당합니다.

는 또한 이후에 실행하는 배경 큐에 작업 완료 핸들러를 의미합니다 (응용 프로그램은 웹 연결에 의해 둔화되지 않도록) URLSession의 dataTask의 이력서 기능이 자동으로 배경 큐에서 실행 것을 알고있다. 그렇기 때문에 완료 핸들러 에서 UI 업데이트가 발생하면 메인 대기열에서 호출이 필요합니다.

let dataTask = URLSession.shared.dataTask(with: request) { 
    // begin completion handler 
    (data, response, error) in 
    guard error == nil else { print("error \(error.debugDescription)"); return } 
    guard let data = data else { print("no data"); return } 
    do { 
     if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]] { 
      print("sending returned JSON to handler") 
      self.responseHandler.handleAPIResponse(jsonArray: json) 
     >>>> DispatchQueue.main.async { <<<< 
       self.tableView.reloadData() 
      } 
     } 
    } catch { 
     print("get tasks JSONSerialization error") 
    } 
} 
dataTask.resume() 
+0

대단히 감사합니다! – JK140

+1

당신의'handleAPIResponse'가 무엇인지 모르겠지만, 모델 객체를 업데이트한다면, 그것도 메인 큐로 연기하는 경우가 있습니다. 백그라운드 스레드에서 모델 객체를 업데이트하고 싶지는 않습니다. 메인 큐를 사용하거나 다른 동기화 메커니즘을 사용할 수 있습니다. – Rob

+0

오, 그래 ... 나는 데이터 테이블 포인트를 만들어야 만하는 기존의 코드를 약간 재현했다. 이것은 여전히 ​​무책임하다. –