在iPhone上,我想在一个单独的线程中对图像进行一些操作。我不想处理semiphores,锁定等,而是使用'One Object,One Thread'方法安全地编写这个并发操作。我不确定将对象复制到新线程的正确方法是什么,以便在主线程中不访问该对象。我使用'复制'方法吗?如果是这样,我是在线程之前还是在线程内部这样做?
...
-(void)someMethod{
UIImage *myImage;
[NSThread detachNewThreadSelector:@selector(getRotatedImage:) toTarget:self withObject:myImage];
}
-(void)getRotatedImage:(UIImage *)image{
...
...
UIImage *copiedImage = [image copy];
...
...
}
答案 0 :(得分:5)
通常,在实现这样的事情时,不要为每个对象创建一个单独的线程 - 相反,当您为对象获取某些内容时,将其排队以由线程池处理。
根据对象的数量,每个对象的一个线程不会扩展得很远。
答案 1 :(得分:4)
最好的办法是简单地获取感兴趣的对象,将其传递给工作线程,并在工作线程启动后不在主线程中引用它。
enter scope
create object
pass the object to the processing thread
start the processing thread
exist scope
// the object is no longer visible/used/referenced
最重要的是要注意:如果你的主线程不打算与工作线程共享对象,那么在主线程上创建对象,在工作线程中创建它,复制并不重要首先是对象,然后启动线程,或者启动线程并复制对象......重要的是你不要在两个线程之间共享对象。你是怎么做的无关。
<强>更新强>
根据你的评论...如果你的主线程仍然需要在getRotatedImage
工作线程中处理它的同时访问图像,那么你必须在 >你在工作线程中传递它。如果您在线程中传递图像并尝试将其复制到线程内,则无法保证图像在复制之前/期间保持不变。