0

タブバーと、タブごとに 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 のロックは行き詰まっています。

4

2 に答える 2

0

私の意見では、この単純なケースではロック (「悪」) を使用するべきではありません。

使用できるのは、一度に 1 つの同時操作を管理するように設定された NSOperationQueue であり、ビュー コントローラーが Web サービス呼び出しをキューに入れるようにします。操作キューは、一度に 1 つの操作のみが実行されることを保証します。操作キューのもう 1 つの利点は、View Controller がキューが空かどうかを確認し、現在のステータスに基づいてその呼び出しをキューに入れるかどうかを決定できることです。最後に、KVO を使用してキューのステータスを観察できるため、各ビュー コントローラーは新しいリクエストを送信する前にこれを簡単に確認できます。

NSOperationQueue を使用する場合と同様に、プライベート GCD シリアル キューを作成し、すべての Web サービス要求 (ブロック内にラップ) を再びキューに入れることもできます。GCD シリアル キューは NSOperationQueues (IMHO) よりも実装が簡単ですが、可観測性と操作をキャンセルする可能性という同じ利点はありません。

于 2013-01-23T10:52:08.473 に答える
0

一度に 1 つのビューで Web サービスにアクセスするだけの場合。シングルトンクラスを利用できます。これは、ネット上の多くの例の 1 つへのリンクです。 http://www.galloway.me.uk/tutorials/singleton-classes/

また、NSUserDefaults を使用して bool 値を保存し、ビューが Web サービスを使用しているかどうかを通知することもできます。簡単な例は次のとおりです。

値を保存するには

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"active_connection"];
[NSUserDefaults synchronize];

取得する

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"active_connection"]) {
   [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"active_connection"];
   [NSUserDefaults synchronize];
   // Send request to web-service
}

これがお役に立てば幸いです。ハッピーコーディング!!

于 2013-01-23T10:52:49.167 に答える