Objective C: Запустите объект на фоновом потоке — взаимодействуют, как обычно?

Я хотел бы иметь объект быть вызываемым от основного потока

MyObj* backgroundObject = [[MyObj alloc] initInBackground];
BOOL result = [backgroundObject computeResult];

Но имейте все методы backgroundObject, вычисляют в другом потоке.

И также имейте backgroundObj смочь отправить сообщения в, он - делегат. Как я могу сделать такую вещь? Действительно ли это возможно?

5
задан DevDevDev 10 March 2010 в 19:07
поделиться

3 ответа

Как уже отмечали другие, NSObject не существует ни в одном потоке, поток появляется только тогда, когда вы начинаете выполнять его методы.

Я бы предложил не использовать ручные потоки для каждого вызова метода объекта, а вместо этого использовать NSOperations и NSOperationQueue. Пусть NSOperationQueue будет переменной экземпляра объекта, а вызовы различных методов объекта создают NSOperations, которые вставляются в очередь. NSOperationQueue будет обрабатывать эти операции в фоновом потоке, избегая всего ручного управления потоками, которое необходимо для многократного доступа к методам.

Если сделать NSOperationQueue с максимальным числом параллелизма равным 1, можно также избежать блокировки общих ресурсов внутри объекта между различными операциями, которые будут выполняться в фоновом потоке (конечно, вам все равно придется блокировать переменные экземпляра, к которым можно получить доступ из внешнего мира).

Для обратных вызовов делегатов или других объектов я бы рекомендовал использовать -performSelectorOnMainThread:withObject:waitUntilDone, чтобы не думать о том, как сделать эти методы делегатов потокобезопасными.

Подробнее см. в Руководстве по параллельному программированию.

7
ответ дан 18 December 2019 в 10:44
поделиться

Конечно, для этого можно использовать NSThread , а для backgroundObject использовать performSelectorOnMainThread: , чтобы связаться с делегатом.

6
ответ дан 18 December 2019 в 10:44
поделиться

Объекты не существуют в потоках AFAIK. Функция, которую вы отправляете объекту, всегда будет выполняться в потоке, из которого вы ее отправили (если вы не используете NSThread или performSelectorOnMainThread или что-то в этом роде).

2
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: