我有一个像这样定义的界面
@interface PageViewController : UIImageView {
...
}
-(void) setImageUsing:(id) obj;
@end
并且实现类似于以下
-(void) setImageUsing:(id) obj
{
...
[self performSelectorInBackground:@selector(changeImage) withObject:nil];
}
由于用户与应用程序的交互,从其他代码调用 setImageUsing
。
我应该如何继续将PageViewController
限制为一次仅限一个后台作业?
换句话说,我想在对setImageUsing
进行新的调用时取消任何正在运行的后台作业,并在此之后开始新的后台作业。
修改/溶液:
正如Ishu所提议的,我尝试使用NSLock进行同步。最终代码(解决了问题)如下所示:
@interface PageViewController : UIImageView {
...
NSLock* m_threadLock;
NSLock* m_externalLock;
BOOL m_cancelThread;
}
-(void) setImageUsing:(id) obj;
@end
并且实现类似于以下
-(void) setImageUsing:(id) obj
{
[m_externalLock lock];
...
if ([m_threadLock tryLock])
{
// succeeded in locking thread lock. so there is no background job running.
// unlock the lock and continue
[m_threadLock unlock];
}
else
{
// failed to lock thread lock. so there IS a job already running.
// ask the job to cancel
m_cancelThread = YES;
}
[self performSelectorInBackground:@selector(changeImage) withObject:nil];
[m_externalLock unlock];
}
-(void) changeImage
{
[m_threadLock lock];
....
if (m_cancelThread)
{
// cancel
}
...
m_cancelThread = NO;
[m_threadLock unlock];
}
希望它能帮助别人。
答案 0 :(得分:0)
这不是终止任何后台任务的好方法,竞争后台线程执行是好的,请参阅此thread。你需要什么,你需要锁定一个线程分配的某种错误。请参阅开发人员文档中的NSLocks,一些谷歌搜索为您提供有关NSLock的一些信息。