iPhone:一个对象,一个线程

时间:2010-03-12 02:47:05

标签: iphone objective-c multithreading concurrency nsthread

在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];
        ...
        ...
    }

2 个答案:

答案 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工作线程中处理它的同时访问图像,那么你必须在 >你在工作线程中传递它。如果您在线程中传递图像并尝试将其复制到线程内,则无法保证图像在复制之前/期间保持不变。