0

最新の SDK を使用して iOS アプリケーションを開発しておりLinkedBlockingQueue、Objective-C を使用して実装する必要があります。

私はこのコードのようなことをしなければなりません:

public boolean onEvent(final EventArgs e) {

    if (e.getClass() != this.eventType) return false;

    long now = android.os.SystemClock.uptimeMillis();

    long diff = now - this.last;

    final long threadExecutionTimeMs = now - lastThreadExecution;

    if (executions.remainingCapacity() == 0)
    {
        executions.poll();
    }

    executions.add(threadExecutionTimeMs);

   ...
}

おそらく使用できますNSMutableArrayが、ブロッキングなどをエミュレートする方法がわかりません。

何かアドバイス?

4

1 に答える 1

0

同等のAFAIKはありません。自分でロールする必要があります。

おそらくディスパッチセマフォを使用すると思います。

キュー内のアイテムのリストであるインスタンス変数を持つクラスを作成します (NSMutableArrayおそらく良い候補です)。クラスには、ディスパッチ セマフォであるインスタンス変数も必要です。-initゼロの初期カウントで配列とセマフォを初期化します。

要素をエンキューするメソッドと要素をデキューするメソッドの 2 つのメソッドを作成します。要素を追加した、エンキューはセマフォにも通知する必要があります。デキューは、要素を削除するにセマフォで待機する必要があります。

コードは次のようになります。

@implementation MyQueue
{
    NSMutableArray* myArray;
    dispatch_semaphore_t fd_sema;
}

-(void) enqueue (id) anObject
{
    @synchronized(myArray)
    {
        [myArray addObject: anObject];
    }
    dispatch_semaphore_signal(fd_sema);
}

-(id) dequeue
{
     dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);
     id ret = nil;
     @synchronized(myArray)
     {
         ret = [myArray objectAtIndex: 0];
         [myArray removeObjectAtIndex: 0];
     }
     return ret;
}

セマフォは、配列内のオブジェクトの数を効果的にカウントします。 dispatch_semaphore_signal()セマフォをインクリメントします。 dispatch_semaphore_wait()セマフォがすでにゼロでない限り、セマフォをデクリメントします。ゼロの場合、他の何かがセマフォにシグナルを送るまでスレッドは停止します。

配列自体へのアクセスは同期されます。これは、a) そうしないと、キューから何かを削除するときに競合状態が発生し、b) NSMutableArray がスレッド セーフであるかどうかを調べるのが面倒だからです。

于 2013-04-02T11:11:51.323 に答える