在退出方法之前等待变量更改

时间:2014-06-25 19:16:08

标签: ios objective-c

我有一个方法,需要调用另一个方法,它将进行回调,我希望我的第一个方法等待,直到该回调进行。我在回调中设置了一个标志,但我需要使用该方法来获取更改。

我尝试了一个while循环,但它占用主线程,在后台调度它似乎也不起作用。

看起来像一个简单的任务,但我无法弄明白......

我想要的是在我的委托方法改变变量后退出的while循环。

-(BOOL) keepAlive{
NSString *name = nil;
NSString *pw = nil;
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"login" accessGroup:nil];
name = [wrapper objectForKey:(__bridge id)kSecAttrAccount];
pw = [wrapper objectForKey:(__bridge id)kSecValueData];
//Call authentication
self.loginType = KeepAlive;
[self.loginManager authenticate:name andPass:pw];
self.loginStatus = loginPending;
while (1) {

    if(self.loginStatus == loginSuccess){
        return true;
    }else{
        return false;
    }

}
return false;

}

3 个答案:

答案 0 :(得分:2)

重组您的代码。

包含keepAlive方法的类应该是实现loginManagerProtocol的代理。

将自己传递给self.loginManagerProtocol setDelegate

然后loginManager应该创建一个定义方法didGetLoginStatus:的协议。

loginManager中,一旦收到回叫,请致电[self.delegate didGetLoginStatus:status]将其发送给持有keepAlive的班级。

-(void)didGetLoginStatus:(bool)status{
   do something
}

您可以找到有关如何实施委托here的详细说明。

答案 1 :(得分:1)

使用委托的另一种方法是回调块:

您可以定义与此类似的登录方法:

 - (void)loginWithCallbackBlock:((^)(BOOL))callback;

您可以将callback()添加到获得响应的部分,只有在收到回复后才会执行该块。

你可以这样叫你方法:

 [loginManager loginWithCallbackBlock:^(BOOL success) {
      //Go to next screen.
 }];

答案 2 :(得分:0)

首先,我同意LyricalPanda您需要重新构建代码。

如果您认为您编写的代码最适合您的项目,则替代方法是使用runloops。 示例代码。

CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
    CFArrayRef allCurrentRunLoopModes = CFRunLoopCopyAllModes(currentRunLoop);
    while (self.loginStatus == loginPending)
    {
        for(NSString *runLoopMode in (__bridge NSArray *)allCurrentRunLoopModes)
        {
            CFRunLoopRunInMode((__bridge CFStringRef)runLoopMode,0.01(change it to suit your need)>,false);
        }
    }
    CFRelease(allCurrentRunLoopModes);

   if(self.loginStatus == loginSuccess){
        return true;
    }else{
        return false;
    }