Objective-C相当于Java的BlockingQueue?

Wil*_*tri 4 iphone multithreading objective-c

经过多年的Java开发,我刚刚进入iPhone开发阶段.我正在寻找与Java的BlockingQueue相当的Objective-C .有类似的东西吗?

如果我以错误的方式处理事情,这就是我想要实现的目标:

我想一次一个地显示从网络服务器中提取的数据块.为了防止用户注意网络延迟,我希望总是预先获取一些数据块.在Java-land中,我在我的提取线程和显示线程之间使用了一个线程安全的队列.

Jon*_*ess 8

这是一个带队列和出队方法的阻塞队列的实现.期望是一个线程进入一个循环调用dequeueUnitOfWorkWaitingUntilDate:并处理工作单元,而第二个线程正在调用queueUnitOfWork:.

@interface MyBlockingQueue : NSObject {
    NSMutableArray *queue;
    NSConditionLock *queueLock;
}
- (id)dequeueUnitOfWorkWaitingUntilDate:(NSDate *)timeoutData;
- (void)queueUnitOfWork:(id)unitOfWork;
@end

enum {
    kNoWorkQueued = 0,
    kWorkQueued = 1
}

@implementation MyBlockingQueue
- (id)init {
    if ((self = [super init])) {
        queueLock = [[NSConditionLock alloc] initWithCondition:kNoWorkQueued];
        workItems = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)dealloc {
    [queueLock release];
    [workItems release];
    [super dealloc];
}

- (id)dequeueUnitOfWorkWaitingUntilDate:(NSDate *)timeoutDate {
    id unitOfWork = nil;
    if ([queueLock lockWhenCondition:kWorkQueued beforeDate:timeoutDate]) {
        unitOfWork = [[[queue objectAtIndex:0] retain] autorelease];
        [queue removeObjectAtIndex:0];
        [queueLock unlockWithCondition:([workItems count] ? kWorkQueued : kNoWorkQueued)];
    }
    return unitOfWork;
}

- (void)queueUnitOfWork:(id)unitOfWork {
    [queueLock lock];
    [queue addObject:unitOfWork];
    [queueLock unlockWithCondition:kWorkQueued];
}
@end
Run Code Online (Sandbox Code Playgroud)