iPhone: один объект, одна нить - PullRequest
3 голосов
/ 12 марта 2010

На iPhone я хотел бы выполнить некоторые операции с изображением в отдельном потоке. Вместо того, чтобы иметь дело с семифорами, блокировками и т. Д., Я бы хотел использовать метод «Один объект, один поток» для безопасной записи этой параллельной операции. Я не уверен, как правильно скопировать мой объект в новый поток, чтобы объект не был доступен в основном потоке. Я использую метод «копирования»? Если это так, я делаю это перед потоком или внутри потока?

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

    }

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

Ответы [ 2 ]

5 голосов
/ 12 марта 2010

Обычно при реализации чего-то подобного вы не создаете отдельный поток для каждого объекта - вместо этого, когда вы получаете что-то для объекта, вы ставите его в очередь для обработки пулом потоков.

В зависимости от количества объектов, один поток на объект не масштабируется очень далеко.

4 голосов
/ 12 марта 2010

Лучше всего просто взять интересующий объект, передать его в рабочий поток и не ссылаться на него в основном потоке после запуска рабочего потока.

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, то вам нужно будет сделать копию до того, как вы передадите это в рабочем потоке. Если вы пропустите изображение в потоке и попытаетесь скопировать его в потоке, то нет гарантии, что изображение останется неизменным до / во время копирования.

...