我有一个方法,需要调用另一个方法,它将进行回调,我希望我的第一个方法等待,直到该回调进行。我在回调中设置了一个标志,但我需要使用该方法来获取更改。
我尝试了一个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;
}
答案 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;
}