タブバーと、タブごとに 1 つずつ、3 つの異なる iOS アプリがありUIViewControllers
ます。このアプリは、SudzC を使用して とC# .NET webservice
やり取りし、データベースからデータを取得します。
3 つのビュー コントローラーすべてから呼び出される Web サービス メソッドが 1 つありますが、任意の時点で 1 つのビュー コントローラーのみがメソッドを呼び出すことができ、データが返されるまで他のビュー コントローラーがそのメソッドを呼び出せないようにする必要があります。
で 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 のロックは行き詰まっています。