我有一个iOS应用程序,带有一个tabbar和3个不同的UIViewControllers
,每个标签一个。该应用程序使用SudzC与C# .NET webservice
接口从数据库中提取数据。控制从多个UIViewControllers访问webservice方法
有一个从所有三个视图控制器调用的webservice方法,但我想强制只有一个视图控制器可以在任何时间点调用该方法,并且在数据一直存在之前没有其他视图控制器可以调用它回。
我试图通过在每个viewController
在AppDelegate
限定NSLock,然后执行下面的代码来解决这个问题:
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];
}
为WebService返回该处理程序被定义为(截断为清楚起见)
-(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锁已经难倒了。
我想NSUSerDefaults解决方案中会存在各种各样的竞争条件。 Singleton解决方案可能会工作,但需要对SudzC库进行一些修改。感谢您的建议,但我一定会考虑辛格尔顿方法。 –
欢迎您!只是不要忘记在这里提到什么对你有用,什么没有。因为这可能会在未来帮助一些同行的编码人员。干杯!! –