我有一个返回字符串值的方法。 在那个方法中,我有两个调用其他方法。第一个包含NSTimer。另一个包含分布式通知。 以前的方法修改返回main方法的字符串变量(bgp_result)。 我需要等待包含我的NSTimer的方法完成,以便继续执行以在main方法中返回正确的值。 所有方法都与变量“bgp_result”属于同一类。
这是我的objective-c ++代码。
std::string MyProjectAPI::bgp(const std::string& val)
{
FBTest *test = [[FBTest alloc] init];
NSString *parameters_objc = [NSString stringWithUTF8String:val.c_str()];
test.parameter_val = parameters_objc;
// This are the two methods
//This method runs the NSTimer. I need to "stop" the execution of the main code until the method launchTimerToCatchResponse finish in order to get an updated value in the variable "bgp_result".
[test launchTimerToCatchResponse];
[test sendPluginConfirmationNotification];
const char *bgp_res = [test.bgp_result cStringUsingEncoding:NSUTF8StringEncoding];
[test release];
return bgp_res;
}
答案 0 :(得分:0)
通常最好能够使用异步处理程序重写函数,以便调用者可以决定是否要等待,或者他是否也非常乐意异步处理结果:
typedef void (^BGPConsumer)(NSString *bgpInfo);
- (void) fetchBGPData: (BGPConsumer) consumer
{
…
[self scheduleTimerThatEventuallyCalls:^{
NSString *info = [self nowWeHaveBGPInfo];
consumer(info);
}];
…
}
如果这不是一个选项,您可以使用信号量阻止执行:
- (void) timesUp
{
dispatch_semaphore_signal(timerSemaphore);
}
- (void) launchTimerToCatchResponse
{
[self setTimerSemaphore:dispatch_semaphore_create(0)];
// …schedule a timer that calls -timesUp after some time
}
- (void) blockedMethod
{
…
[self launchTimerToCatchResponse];
dispatch_semaphore_wait(timerSemaphore);
dispatch_release(timerSemaphore);
[self setTimerSemaphore:nil];
…
}