2013-04-02 22 views
0

我正在開發一個帶有最新SDK的iOS應用程序,我必須在Objective-C中實現LinkedBlockingQueueObjective-C相當於Java的LinkedBlockingQueue <Long>

我必須做這樣的事情代碼:

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,但我不知道如何模擬封鎖等

有什麼建議?

回答

0

沒有相應的AFAIK,你需要自己推出。我想我可能會使用dispatch semaphore

用實例變量創建一個類,該實例變量是隊列中的項目列表(NSMutableArray可能是一個很好的候選項)。該類還應該有一個實例變量,它是一個調度信號量。 在-init初始化數組和信號量的初始計數爲零。

創建兩個方法,一個入隊一個元素和一個出隊元素。排隊還必須在之後加入元素來發信號燈。在刪除元素之前,出列必須等待信號量

的代碼會是這個樣子:

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