3

iPhoneでは、別のスレッドで画像に対していくつかの操作を行いたいと思います。セミフォアやロックなどを扱うのではなく、この並行操作を安全に作成するために「1つのオブジェクト、1つのスレッド」メソッドを使用したいと思います。オブジェクトがメインスレッドでアクセスされないように、オブジェクトを新しいスレッドにコピーする正しい方法がわかりません。'copy'メソッドを使用しますか?もしそうなら、私はこれをスレッドの前またはスレッドの内側で行いますか?

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

    }

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

2 に答える 2

5

通常、このようなものを実装する場合、オブジェクトごとに1つのスレッドを作成するのではなく、オブジェクトに実行させるものを取得するときに、スレッドプールによって処理されるようにキューに入れます。

オブジェクトの数によっては、オブジェクトごとに1つのスレッドがそれほどスケーリングされません。

于 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

注意すべき最も重要なこと:メインスレッドがオブジェクトをワーカースレッドと共有しない場合は、メインスレッドでオブジェクトを作成し、ワーカースレッドで作成し、最初にオブジェクトをコピーするかどうかは関係ありません。次に、スレッドを開始するか、スレッドを開始してオブジェクトをコピーします...重要なことは、2つのスレッド間でオブジェクトを共有しないことです。それをどのように行うかは関係ありません。

更新:
コメントによると...メインスレッドがワーカースレッドで画像を処理しているのと同時に画像にアクセスする必要がある場合は、ワーカースレッドに渡すgetRotatedImageにコピーを作成する必要があります。画像をスレッドに渡してスレッド内にコピーしようとすると、コピー前/コピー中に画像が変更されないという保証はありません。

于 2010-03-12T03:02:58.217 に答える