gpt4 book ai didi

iphone - 在 UIImageView 中同步后台作业

转载 作者:行者123 更新时间:2023-11-28 17:44:59 25 4
gpt4 key购买 nike

我有一个这样定义的接口(interface)

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

希望它能帮助其他人。

最佳答案

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

关于iphone - 在 UIImageView 中同步后台作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com