我有一個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庫進行一些修改。感謝您的建議,但我一定會考慮辛格爾頓方法。 –
歡迎您!只是不要忘記在這裏提到什麼對你有用,什麼沒有。因爲這可能會在未來幫助一些同行的編碼人員。乾杯!! –