Похоже, что вы думаете , что вы хотите сделать, это заблокировать выполнение до завершения аутентификации. Это может быть возможным, если AuthenticateMobileServer
порождает фоновый поток для работы - вы бы использовали объект синхронизации, такой как NSLock - но это действительно плохая идея. Зачем вообще иметь фоновый поток, если вы все равно собираетесь блокировать? А синхронизация потоков общеизвестно сложна и подвержена ошибкам, если вы не знаете, что делаете, а вы (давайте посмотрим правде в глаза) этого не сделаете.
Вместо этого вы, вероятно, должны принять, что во время аутентификации будет период неопределенности, в течение которого ваше приложение должно продолжать обработку в некотором промежуточном состоянии, а затем использовать callback , чтобы уведомлять вас, когда аутентификация завершена, и вы можете продолжить с тем, что вам нужно сделать с аутентифицированным пользователем.
Существует множество способов сделать это, и в вопросе недостаточно подробностей, чтобы точно сказать, какой из них лучше. Но вы, похоже, уже используете что-то очень похожее в ClassB
, поэтому я бы сказал, сделайте то же самое с ClassA
:
Inside ClassA:
-(void)authenticateUser
{
authenticate_Obj = nil;
[classB_Obj authenticateMobileUserAndNotify:self action:@selector(authenticatedObject:)];
// returns more or less immediately, not yet authenticated
}
-(void)authenticatedObject:(YourAuthObjectClass*) authObj
{
authenticate_Obj = authObj;
// do post-authentication stuff here
}
Inside ClassB:
-(void)authenticateMobileUserAndNotify:(id)target action:(SEL)sel
{
// I'm making these ivars for simplicity, there might be other considerations though
callbackTarget = target;
callbackSelector = sel;
[mobile_Obj AuthenticateMobileServer:self action:@selector(Handler:)];
}
-(void)Handler:(id)value
{
authenticate_G_Obj = (AuthenticateObj*)value;
[callbackTarget performSelectorOnMainThread:callbackSelector withObject:authenticate_G_Obj waitUntilDone:NO];
}
Очевидно, что это всего лишь эскиз, и он не предназначен для использования как есть. И вам нужно будет рассмотреть, что происходит в вашем приложении в состоянии ожидания, когда идет аутентификация, но authenticate_Obj
все еще nil
. Но, надеюсь, вы поняли идею.