Wil*_*tri 4 iphone multithreading objective-c
经过多年的Java开发,我刚刚进入iPhone开发阶段.我正在寻找与Java的BlockingQueue相当的Objective-C .有类似的东西吗?
如果我以错误的方式处理事情,这就是我想要实现的目标:
我想一次一个地显示从网络服务器中提取的数据块.为了防止用户注意网络延迟,我希望总是预先获取一些数据块.在Java-land中,我在我的提取线程和显示线程之间使用了一个线程安全的队列.
这是一个带队列和出队方法的阻塞队列的实现.期望是一个线程进入一个循环调用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)