在UIImageView中同步后台作业

时间:2011-06-27 04:35:28

标签: iphone ios ipad ios4 uiimageview

我有一个像这样定义的界面

@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];
     }

希望它能帮助别人。

1 个答案:

答案 0 :(得分:0)

这不是终止任何后台任务的好方法,竞争后台线程执行是好的,请参阅此thread。你需要什么,你需要锁定一个线程分配的某种错误。请参阅开发人员文档中的NSLocks,一些谷歌搜索为您提供有关NSLock的一些信息。