[ios]objective-c 相当于 Java 的 LinkedBlockingQueue

标签: ios Objective-C
发布时间: 2017/3/21 23:07:53
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在开发一个 iOS 应用程序与最新的 SDK,我不得不实施 LinkedBlockingQueue 与目的 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 但我不知道怎样才能效仿阻塞等。

什么建议吗?

解决方法 1:

还有没有等效的 AFAIK,你需要自己来。

我想我可能会使用一个调度信号量

创建一个类的实例变量,它是在队列中的项的列表 ( NSMutableArray 可能是一个很好的候选人)。 类也应该是一个调度信号量的实例变量。 在 -init 初始化数组和具有初始计数为 0 的信号量。

创建两个方法,一个队列元素,一个队列的元素。 队列还必须信号信号量添加元素。出队必须等待信号量之前移除元素。

代码将如下所示︰

@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()递减信号量除非它已经是零,在这种情况下线程停止直到别的信号信号量。

对阵列本身的访问被同步,因为上从队列中移除的东西否则会) 有争用条件和 b) 我懒得去查查是否 NSMutableArray 是线程安全的。

赞助商