2017-01-09 2 views
1

이전에 이와 비슷한 질문을했지만이 질문은 Swift의 일반적인 언어와 기본 사항에 관한 것입니다. 아래 코드에서 기술적으로 작동하지 않아야하고 레이블 텍스트를 변경하면 안됩니까? 나는 지금 당장 그것을 실행하고 실패 할 때마다. 나는 모든 콘센트가 제대로 연결되어 있는지 확인했습니다. 죄송합니다 답변이 분명하다면, 나는 스위프트를 처음 사용합니다.함수를 통해 UILabel 업데이트 .... 누락 된 것이 있습니까?

func changeLabel() { 
    DispatchQueue.main.sync(execute: { 
     self.testText.text = "YES" 
    }) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let city:String? = nil 
    if city == nil { 
     changeLabel() 
    } 
} 

답변

2

viewDidLoad은 항상 메인 스레드에서 (- 그리고 그것은 완전히 다른 문제입니다 프로그래머가 실수로 달리하지 않는 한)이라고합니다.

DispatchQueue.main.sync을 사용하여 레이블을 업데이트 할 필요가 없습니다. 사실,이 경우에는 좋지 않습니다. 메인 대기열에 이미있을 때 DispatchQueue.main.sync을 호출하면 앱이 종료 될 때까지 앱의 사용자 인터페이스가 중단됩니다. 그것은 당신이 게시 코드에서 필요하지 이후

  1. DispatchQueue.main.sync의 사용을 제거

    당신은 두 가지 선택이있다.

  2. sync에서 async으로 변경하십시오. 이렇게하면 앱 사용자 인터페이스가 멈추는 문제가 해결되며 어떤 대기열에서도 changeLabel 메서드를 호출하여 제대로 작동 할 수 있습니다.
+0

정말 고마워요. 나는 지난 몇 일 동안 내가 일하고있는 프로젝트에 대해 이것을 조사해 왔지만 나는 옳은 대답을 찾지 못하고있다. 고맙게도,이 모든 것이 해결되었습니다. – Gabe

-2

사용이 대신 :

func changeLabel() { 
    DispatchQueue.global().async(execute: { 
    print("teste") 
    DispatchQueue.main.sync{ 
     self.testText.text = "YES" 
    }}) 

감사

+0

왜? 어느 쪽의 디스패치 큐의 포인트인가? – rmaddy

관련 문제