方法调用乱序?

时间:2011-03-05 03:32:03

标签: iphone objective-c ios

我有以下代码:

    [self.view bringSubviewToFront:loggingIn];
    [self loginWithUsername:user Password:pw];

这是按下按钮的IBAction方法。按钮保持高亮显示直到用户登录(这可能需要几秒钟),然后出现视图。为什么视图在调用login方法之前没出现?

2 个答案:

答案 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的方法。由于您使用两个参数,因此您需要将两者都作为单个对象传递或使用实例变量。