존의 대답은 효과가 있지만 스레드를 실행하는 것보다 실행 루프와 관련이 있습니다. 기본적으로 앱이 버튼을 클릭하는 것과 같은 이벤트를 받으면 핸들러가 주 스레드에서 실행됩니다. UI 변경 사항은 핸들러가 완료된 후에 발생합니다. 이를 통해 코코아는이를 분석/수행함으로써 그래픽 업데이트를 최적화 할 수 있습니다. 비밀번호 : : [원문] 방법 당신의 loginWithUsername를 호출하기 전에 -
Run Loop:
Event -> Your Handler Code -> System Updates UI
그래서 당신은 시스템이 UI 업데이트를 시작하도록하기 위해 핸들러 코드를 완료하도록 할 필요가있다. 타이머를 예약하면 실행 루프의 다음 반복으로 넘어갑니다 (타이머가 꺼지면 다음 루프를 트리거하는 "이벤트"가됩니다). 그래서,
Run Loop (2 iterations):
Mouse Click -> Your Handler Code (reorder views) -> System reorders views
Timer Fires -> Your Handler Code (trigger login) -> Any addl UI updates
그래서 같은 것을 할 :
- (void) buttonHandler: (id)sender {
[self.view bringSubviewToFront:loggingIn];
[self performSelector: @selector(performLogin)
withObject: [NSArray arrayWithObjects:user, pw, nil]
afterDelay: 0];
}
- (void) performLogin: (NSArray *)args {
[self loginWithUsername:[args objectAtIndex:0] Password:[args objectAtIndex:1]];
}
이 배열 될 필요가 없습니다. 사전에 사용자 이름과 암호를 압축하여 대신 인수로 사용할 수도 있습니다.
실마리를 얻을 수 있다면 더 많은 코드를 게시해야한다고 생각합니다. 문제는 아마 login-method가 메인 스레드를 잡고 있다는 것입니다. – Jensen2k