我有以下代码:
[self.view bringSubviewToFront:loggingIn];
[self loginWithUsername:user Password:pw];
这是按下按钮的IBAction方法。按钮保持高亮显示直到用户登录(这可能需要几秒钟),然后出现视图。为什么视图在调用login方法之前没出现?
答案 0 :(得分:2)
John的答案可行,但它与Run Loop有关,而不是阻塞线程。基本上,只要您的应用收到点击按钮等事件,您的处理程序就会在主线程中运行。在处理程序完成后,您对UI所做的任何更改都会发生。这让Cocoa可以通过分析/执行它们来优化图形更新。
Run Loop:
Event -> Your Handler Code -> System Updates UI
因此,在调用loginWithUsername:Password:[sic]方法之前,需要让处理程序代码完成以便让系统开始更新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]];
}
它不一定是一个数组。您也可以在字典中打包您的用户名和密码,并将其用作您的参数。
答案 1 :(得分:1)
第一个调用在另一个线程中运行,该线程被第二行阻塞。尝试使用:
将第二个调用延迟.1秒左右 - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
NSObject的方法。由于您使用两个参数,因此您需要将两者都作为单个对象传递或使用实例变量。