Я хотел бы иметь объект быть вызываемым от основного потока
MyObj* backgroundObject = [[MyObj alloc] initInBackground];
BOOL result = [backgroundObject computeResult];
Но имейте все методы backgroundObject, вычисляют в другом потоке.
И также имейте backgroundObj смочь отправить сообщения в, он - делегат. Как я могу сделать такую вещь? Действительно ли это возможно?
Как уже отмечали другие, NSObject не существует ни в одном потоке, поток появляется только тогда, когда вы начинаете выполнять его методы.
Я бы предложил не использовать ручные потоки для каждого вызова метода объекта, а вместо этого использовать NSOperations и NSOperationQueue. Пусть NSOperationQueue будет переменной экземпляра объекта, а вызовы различных методов объекта создают NSOperations, которые вставляются в очередь. NSOperationQueue будет обрабатывать эти операции в фоновом потоке, избегая всего ручного управления потоками, которое необходимо для многократного доступа к методам.
Если сделать NSOperationQueue с максимальным числом параллелизма равным 1, можно также избежать блокировки общих ресурсов внутри объекта между различными операциями, которые будут выполняться в фоновом потоке (конечно, вам все равно придется блокировать переменные экземпляра, к которым можно получить доступ из внешнего мира).
Для обратных вызовов делегатов или других объектов я бы рекомендовал использовать -performSelectorOnMainThread:withObject:waitUntilDone
, чтобы не думать о том, как сделать эти методы делегатов потокобезопасными.
Подробнее см. в Руководстве по параллельному программированию.
Конечно, для этого можно использовать NSThread
, а для backgroundObject
использовать performSelectorOnMainThread:
, чтобы связаться с делегатом.
Объекты не существуют в потоках AFAIK. Функция, которую вы отправляете объекту, всегда будет выполняться в потоке, из которого вы ее отправили (если вы не используете NSThread или performSelectorOnMainThread или что-то в этом роде).