3

在 iPhone 上,我想在单独的线程中对图像进行一些操作。我不想处理信号量、锁定等,我想使用“一个对象,一个线程”的方法来安全地编写这个并发操作。我不确定将我的对象复制到新线程中的正确方法是什么,以便在主线程中不访问该对象。我是否使用“复制”方法?如果是这样,我是在线程之前还是在线程内部执行此操作?

     ...
    -(void)someMethod{
        UIImage *myImage;
        [NSThread detachNewThreadSelector:@selector(getRotatedImage:) toTarget:self withObject:myImage];

    }

    -(void)getRotatedImage:(UIImage *)image{
        ...
        ...
        UIImage *copiedImage = [image copy];
        ...
        ...
    }
4

2 回答 2

5

通常,在实现这样的事情时,您不会为每个对象创建一个线程 - 相反,当您为对象执行某些操作时,您会将其排队以由线程池处理。

根据对象的数量,每个对象一个线程不会扩展得很远。

于 2010-03-12T05:41:20.007 回答
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制作副本。如果您在线程中传递图像并尝试在线程内复制它,则无法保证图像在复制之前/复制时保持不变。

于 2010-03-12T03:02:58.217 回答