Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone:一个对象,一个线程_Iphone_Objective C_Multithreading_Concurrency_Nsthread - Fatal编程技术网

iPhone:一个对象,一个线程

iPhone:一个对象,一个线程,iphone,objective-c,multithreading,concurrency,nsthread,Iphone,Objective C,Multithreading,Concurrency,Nsthread,在iPhone上,我想在单独的线程中对图像执行一些操作。我希望使用“一个对象,一个线程”的方法安全地编写这个并发操作,而不是处理半量、锁定等。我不确定将我的对象复制到新线程中的正确方法是什么,这样就不会在主线程中访问该对象。我是否使用“复制”方法?如果是,我是在线程之前还是线程内部执行此操作 ... -(void)someMethod{ UIImage *myImage; [NSThread detachNewThreadSelector:@se

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

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

    }

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

最好的方法是简单地获取感兴趣的对象,将其传递到工作线程中,而不是在工作线程启动后在主线程中引用它

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
需要注意的最重要的一点是:如果主线程不打算与工作线程共享对象,那么在主线程上创建对象、在工作线程中创建对象、先复制对象然后启动线程、或启动线程然后复制对象都无关紧要。。。重要的是不要在两个线程之间共享对象。你如何做到这一点无关紧要

更新:

根据你的评论。。。如果在
GetRotateImage
工作线程中处理图像的同时,主线程仍需要访问该图像,则必须在将其传递到工作线程之前制作副本。如果在线程中传递图像并尝试在线程内部复制,则无法保证图像在复制之前/复制时保持不变。

通常,在实现类似的操作时,您不会为每个对象创建单个线程-相反,当您为对象做些事情时,您可以将其排队以由线程池处理


根据对象的数量,每个对象的一个线程不会缩放太远。

作为警告,在另一个线程上编辑图像时必须非常小心。调用只能在主线程上安全运行的方法和函数很容易陷入麻烦。另外,由于iPhone是单核的,所以要非常仔细地权衡一下这样做会带来什么好处。最好一起重新设计应用程序界面。这是一个很好的观点。我知道用户界面元素只能从主线程调用,但实际上它是所有包含UIImage的UIkit对象。GingerBreadMane:public
UIImage
方法目前实际上是线程安全的,但是由于接口契约中没有这个方法,所以不应该依赖它。(
UIImage
只是
cgimagerf
上的一个薄薄的包装器)这很好,它解释了为什么我还没有在单独的线程中调用UIImage遇到任何问题。但是就像你说的,它不应该被依赖。图像确实需要通过主线程中的其他方法访问。辅助工作线程只需要映像来执行一些计算,然后报告这些计算。我在原始帖子中所做的是否成功阻止了主线程和次线程共享对象?@GingerBreadMane我已经根据您的评论更新了我的答案。“我希望这会有帮助。”姜饼直接回答你的问题:不,考虑到你给我的信息,我认为在线程内复制图像是不安全的。在你把它传递到线程之前做它。谢谢你为我清理这个Lirik。是[myImage copy];使用合适的方法?这会在内存中创建对象的新副本吗?另外,下面的代码是否也会创建myImage的副本:UIImage*imageToPassToThread=[[UIImage alloc]init];imageToPassToThread=myImage@姜饼不幸的是,我的“专长”以多线程概念结束。我没有任何使用IPhone库的经验,因此我无法就如何正确复制图像向您提供任何有用的建议。。。但我希望我的回答为你指明了正确的方向。