2012-01-11 83 views
1

我有一個方法返回一個字符串值。 在這種方法中,我有兩個調用其他方法。第一個包含一個NSTimer。另一個包含分發通知。 以前的方法修改返回主方法(bgp_result)的字符串變量。 我需要等待包含我的NSTimer的方法才能繼續執行,以便在我的主方法中返回正確的值。 所有的方法和變量「bgp_result」在同一個類中。如何等待,直到NSTimer停止

這是我的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

它通常是最好的時候,你可以使用異步處理,所以,如果他願意等待,或者如果他很高興異步處理結果,也主叫方可以決定重寫功能:

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]; 
    … 
}