在从事 Java 开发多年后,我刚刚开始涉足 iPhone 开发。我正在寻找与 Java 等效的 Objective-C阻塞队列 http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html。有这样的事吗?
如果我以错误的方式处理事情,这就是我想要实现的目标:
我想一次显示一个从网络服务器提取的数据块。为了防止用户注意到网络延迟,我希望始终预取一些数据块。在 Java 领域,我会在获取线程和显示线程之间使用线程安全队列。
这是一个带有队列和出队方法的阻塞队列的实现。预期是一个线程进入调用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)