У меня определен интерфейс, подобный этому
@interface PageViewController : UIImageView {
...
}
-(void) setImageUsing:(id) obj;
@end
, а реализация похожа на следующую
-(void) setImageUsing:(id) obj
{
...
[self performSelectorInBackground:@selector(changeImage) withObject:nil];
}
setImageUsing
вызывается из другого кода в результате взаимодействия пользователя с приложением,
Как мне перейти к ограничению PageViewController
только одним фоновым заданием за раз?
Другими словами, я хотел бы отменить любое фоновое задание при новом вызове setImageUsing
сделано и запустите новое фоновое задание после этого.
РЕДАКТИРОВАНИЕ / РЕШЕНИЕ :
Как предложил Ишу, я попытался использовать 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];
}
Надеюсь, это поможет кому-то еще.