我有一个带有标签栏和 3 个不同的 iOS 应用程序,UIViewControllers
每个标签一个。该应用程序使用 SudzC 与 a 交互以C# .NET webservice
从数据库中提取数据。
从所有三个视图控制器调用一个 web 服务方法,但我想强制只有一个视图控制器可以在任何时间点调用该方法,并且在返回数据之前没有其他视图控制器可以调用它。
我试图通过在 NSLock 中定义一个 NSLock 来解决这个问题AppDelegate
,然后在每个中实现以下代码viewController
:
if([SharedAppDelegate.loginLock lockBeforeDate:[[[NSDate alloc] init] dateByAddingTimeInterval:30.0]])
{
// got the lock so call the webservice method
SDZiOSWebService* webService = [SDZiOSWebService service];
[webService Login:self action:@selector(handleRelogin:) username:userName password:password];
}
else
{
// can't get lock so logout
self->reloginInProgress = false;
[SharedAppDelegate doLogout];
}
Web 服务返回的处理程序定义为(为清楚起见截断)
-(void)handleRelogin: (id) result {
SDZLoginResult *loginResult = (SDZLoginResult*)result;
if(loginResult.Status)
{
SharedAppPersist.key = loginResult.key;
}
else
{
SharedAppPersist.key = @"";
}
[SharedAppDelegate.loginLock unlock];
}
我的理解是第一个UIViewController
会获得锁,而其他人会阻塞长达 30 秒以等待获得锁。但是,在极少数情况下,不止一个人同时viewController
尝试访问锁,我会立即收到以下错误:
*** -[NSLock lockBeforeDate:]: deadlock (<NSLock: 0x2085df90> '(null)')
谁能告诉我我做错了什么?我对 C/C++ 中的锁有很好的理解,但是这些 Objective-C 锁被难住了。