Objective-C相当于Java的LinkedBlockingQueue <long> </long>

时间:2013-04-02 10:42:40

标签: ios objective-c linked-list

我正在使用最新的SDK开发iOS应用程序,我必须使用Objective-C实现LinkedBlockingQueue

我必须做类似这样的代码:

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 个答案:

答案 0 :(得分:0)

没有等效的AFAIK,你需要自己动手。

我想我可能会使用dispatch semaphore

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

创建两个方法,一个用于排队元素,另一个用于使元素出列。 添加元素后,enqueue还必须发出信号量的信号。在删除元素之前,dequeue必须等待信号量

代码看起来像这样:

@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是否是线程安全的。