問題タブ [nscondition]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1269 参照

objective-c - NSCondition: 再帰的ロック?

約 10 個のワーカー スレッドが同時にアクセスするブロッキング キューの作成に取り組んでいます。キューの基本的な実装は次のようになります。

はどこ_mutexですかNSCondition-isEmptyおよび-sizeメソッドには問題があります。

データが破損していないことを確認するためにミューテックスをロックする必要があるため、NSCondition再帰的にロックしないため、プログラムがデッドロックに陥ります。ただし、実装を次のように変更すると:

その後、プログラムはデッドロックしませんが、ロックを再取得するまでに、別のワーカーが既に必要なオブジェクトをキューから取り出しています。NSCondition再帰を作成する方法について何か考えはありますか?

0 投票する
2 に答える
3999 参照

ios - iOS-Objective-C-待機中にNSThreadを停止する方法は?

nsthreadがあり、この中にwhileループがあります。mainメソッドの「スレッドセーフ」キューからオブジェクトを取得しています。このnsthreadオブジェクトを含むUIViewControllerを離れるとき、nsthread cancelメソッドを呼び出しますが、「queueLock」NSConditionによってロックされているため、停止しません。このUIViewControllerに戻ると、新しいnsthreadが作成され、オブジェクトがキューから取得されますが、前のスレッドは引き続き終了し、両方がキューから同じオブジェクトを使用しようとするため、メモリ管理の問題が発生します。私の質問は、UIViewControllerを離れるときに、このスレッドをどのように停止する必要があるかです。

NSThreadのメインメソッド:

これは、キュークラスのgetメソッドです。

ありがとう!

0 投票する
1 に答える
1879 参照

objective-c - Objective-cで指定された時間にスレッドをウェイクアップするにはどうすればよいですか?

私はobjective-cでsshラッパーを書いていますが、コマンドの実行に必要なmaxTimeを実装しようとしています。私がそれを実装する方法は次のとおりです。

メインスレッド:

  1. タイムアウトを計算する
  2. コマンドを実行して返されたデータを解析するためのasyncThread(GCDキュー)を作成します
  3. waitForTimeoutOrSignal
  4. 結果を返す

AsyncThread:

  1. コマンドを実行する
  2. 返されたデータを取得する
  3. 正しいデータ信号を受信した場合MainThread

C#では、ManualResetEventsを使用してMainThreadに信号を送ることに成功しました。Objective-Cで私が見つけることができる最も近いクラスはNSConditionですが、スレッド間通信用に構築されていないようです。

実際、私は次のようになります。

2012-05-22 00:31:05.761 libssh2-for-iOS [60821:11303] **-[NSConditionunlock]:条件('(null)')がロックされなかったスレッドからロック解除されました

2012-05-22 00:31:05.763 libssh2-for-iOS [60821:11303] **デバッグするには_NSLockError()を中断します。

使ってみると。NSConditionを使用する別の方法、またはスレッドが何らかの信号を受信するまでスリープするためのより良い方法はありますか?

0 投票する
1 に答える
841 参照

ios - NSCondition - 複数のスレッド

NSCondition の使用方法は次のとおりであることを知っています。

方法 1:

方法 2:

私が望むのは、さまざまなスレッドからロックおよびロック解除できる単純なロックを使用することだけなので、そのために NSCondition を使用する必要があることを理解しました。論理的には使用しないでください (apple doc から:「これらのスプリアス信号によって引き起こされる問題を回避するには、常に条件ロックと組み合わせて述語を使用する必要があります」)。

メソッド間には依存関係がありますが、それは両方の方法にあります。つまり、他のメソッドがロックを解放するまで、誰も自分の作業を行うことができません (ロックは、その作業の本体からディスパッチされた 3 番目のスレッドで解放される可能性があります)。それをロックした方法)。

  1. 両方のメソッドから条件を待ち、両方の最後にそれを通知することは可能ですか?

  2. method1 の 3 つのスレッドが同時に待機している場合、それらはどのような順序で作業に入るでしょうか? ウェイティングに入った順番だと思いますが、正しいですか?

0 投票する
3 に答える
2507 参照

objective-c - iOS 6.0 GM とのセッションを閉じる際の EAAcessory エラー

Bluetooth (2.1 + EDR) 経由で iPhone 4S (6.0 GM) または iPad (6.0 GM) に接続されている MFI デバイスがあります。プロジェクトは Xcode 4.5 GM で構築されました。アプリが取得EAAccessoryDidDisconnectNotificationすると、メッセージが送信されます[_eaSessionController closeSession];。これらはすべて、iOS 5.1.1 以前で問題なく動作しました。しかし、このメッセージが表示された iOS6 では、次のようなログを取得しました。

何か案は?

0 投票する
1 に答える
242 参照

iphone - NSURLConnection の特定のステータスを待つ方法

すでにここにある 1,000 を超える質問に加えて、さらに別の NSURLConnection の質問に煩わされて申し訳ありません。

シナリオは次のとおりです。動的に読み込まれる拡張現実機能を使用する iPhone アプリでは、新しい AR モデルが利用可能になると、ユーザーはそのモデルをダウンロードするように求められます。モデルは数 MB の大きさになる可能性があるため、ダウンロードすることを決定する前に、ダウンロードするすべてのモデルの合計サイズをユーザーに示す必要があります。

各ファイルのサイズを確認するには、非同期 NSURLConnection を使用しますが、応答 ([NSURLResponse expectedContentLength]) を取得したらダウンロードを停止します。これは、デリゲートの connection:didReceiveResponse: メソッドで実行できます。

私の質問は、この状態が発生するまでどのように待つことができるでしょうか? NSURLConnection をセットアップし、非同期に開始してから、connection:didReceiveResponse: メソッドが呼び出されるまで待機するにはどうすればよいですか? 私は NSCondition を使用してみました。これは、NSURLConnection をセットアップした後、および connection:didReceiveResponse: メソッドで条件を通知するときに待機させます。しかし、これはメインスレッドをフリーズさせるだけでした。何か案は?

0 投票する
1 に答える
3418 参照

ios - NSCondition を使用した非同期メソッドの待機

インターネット経由で非同期に 4 つの plist ファイルをダウンロードしています。最初の実行で UIViewController をプッシュするか、その後のすべての実行でデータを更新してすべての UITableView をリロードするまで、4 つのファイルすべてがダウンロードされるまで待つ必要があります。

最初の実行では、すべてが完全に機能します。ただし、更新すると、4 つの URL 要求がすべて呼び出されて開始されますが、完了ブロックまたは失敗ブロックは呼び出されず、UI がフリーズします。バックグラウンドスレッドですべての操作を実行するので、これは奇妙です。なぜこれが起こっているのか理解できませんでした。

最初の load メソッドと refresh メソッドは、4 つの「update」メソッドを同じ方法で呼び出し、NSCondition を同じ方法で使用します。

最初の実行の場合:

データを更新する場合:

上記の各読み込み方法に表示される以下のブロックは、特定のデータをダウンロードして更新する方法に対応しています。

実行されます:

完了ブロックと失敗ブロックは同じメソッドを呼び出してデータを更新します

では、これが最初の実行では機能するのに、その後の実行では機能しないのはなぜですか?

0 投票する
0 に答える
29 参照

cocoa-touch - 呼び出されたメソッドへの非同期呼び出しの結果を返す

現在取り組んでいるアプリの標準 NSURLConnection クラスを作成しています。これは、後続のアプリでも使用できることを願っています。

アイデアは、URL とパラメーター配列をこのクラスのメソッドに渡して接続を開始し、完了時に結果を返せるようにすることです。

これを別のクラスから呼び出しているので、結果をその呼び出しクラスの変数に設定できるようにしたいと考えています。

問題は、結果がすぐに届かないことです。そのため、「go」メソッドで設定した NSData を返すと空白になります。

NSCondition のようないくつかのことを試し、go メソッドの別のスレッドで while ループを実行して、それが終了したかどうかを確認しました。

残念ながら、私はこれを事前に知りませんでした。NSURLConnections からの非同期接続は、「go」メソッドで実行された NSCondition と同じスレッドで実行されます。このため、そのメソッドをロックして早期に返さないようにしたときに、接続もロックして、完了コールバックに到達しませんでした。

接続が完了するまで「go」メソッドを効果的に一時停止して、アプリのどこにでもデータを返すことができるようにするにはどうすればよいですか。

私がこれについて完全に間違った方法で行っている可能性があるので、その場合はお知らせください。ただし、複数のリクエストが同時に送信され、この接続クラスのさまざまなインスタンスがそれらすべてを制御できるようにしたいため、このように機能する必要があります。

0 投票する
2 に答える
1812 参照

ios - バックグラウンド スレッドがユーザー入力を取得するまでメイン スレッドを一時停止する

メインの開始スレッドでは、コードを一時停止して新しいスレッドを開始し、ユーザーの入力が得られるまで待機する必要があります。次に、作成された新しいスレッドを破棄して、メイン スレッドが中断したところに戻りたいと思います。しかし、何が起こっているかというと、新しいスレッドが呼び出されますが、メイン スレッドはコードを処理し続けます。ユーザーがインターフェイス ボタンを使用するのを妨げずに、これを処理するにはどうすればよいですか? if(moveCount == 2) ステートメントで別の nscondition を作成する必要があるのではないでしょうか? または、メイン スレッドが、ユーザー入力を通知する他のスレッドからのシグナルを受信するまで待機する必要があること。

追加の注意: また、インターフェイスで 2 つの UIButton を引き続き使用できるように、元のスレッドを一時停止したいと思います。

IM に寄せられた質問に関するその他の注意事項: これは私が作成しているゲームです。コードのどこかで、私のメソッドの 1 つのメイン スレッドを意味します。このメソッドは、移動している方向を決定し、タグ差を取得してから攻撃を行います。ただし、2 つの攻撃が行われる場合があるため、この時点で、ユーザーは画面上で 2 つのボタンをクリックして、どちらの攻撃を行うかを決定できます。

また、メインスレッドを今すぐ一時停止するべきではないことも静かに明らかです。もしそうなら、代替手段は何ですか?ありがとう

NSCondition と NSThread

私のviewDidLoadで以下を作成します。

どこか中間コード..

aThread メソッド

0 投票する
2 に答える
630 参照

ios - NSConditionLock を使用した iOS 単体テストで asyn 操作を待機する方法

非同期タスクが完了するまで待機する必要がある単体テストがあります。私は NSConditionLock を使用しようとしていますが、それはかなりクリーンなソリューションのようですが、動作させることができません。

いくつかのテスト コード:

私はここで解決策に従おうとしていました: How to unit test asynchronous APIs?

ロックすると、デリゲートは呼び出されません。ロックコードを取り出して簡単なタイマーを入れると、問題なく動作します。

スレッド全体をロックし、ログイン コードを実行させず、実際に非同期呼び出しを行っていますか?

また、ログイン呼び出しを別のスレッドに配置して、ロックされないようにしました。

私は何を間違っていますか?

ログインコードを追加して編集します。読みやすくするためにコードをトリミングします。基本的に、AFNetworking を使用して POST を実行するだけです。完了すると、デリゲート メソッドが呼び出されます。ログインして http リクエストを作成します。