2010-06-20 2 views
2

Я по-прежнему новичок в синтаксисе Objective C, поэтому я могу быть слишком сложным, но я не могу понять, как передать NSTimeInterval в поток.Как передать объект NSTimeInterval для detachNewThreadSelector с параметром Object?

Я хочу, чтобы инициировать поток, который спит в параметре х секунд посланного от основного потока следующим образом:

[NSThread detachNewThreadSelector:@selector(StartServerSynchThread) toTarget:self withObject:5]; 

- (void) StartServerSynchThread:(NSTimeInterval *)sleepSecondsInterval { 

    [NSThread sleepForTimeInterval:sleepSecondsInterval]; 

} 

Но компилятор продолжает давать мне ошибку синтаксиса. Я точно не знаю, как это сделать. Любая помощь будет оценена по достоинству. Благодаря!

ответ

2

Параметр object имеет тип id, что означает, что могут передаваться только объекты класса. Целые числа, такие как 5, которые вы пытаетесь передать, а также NSTimeInterval (фактически всего лишь typedef для double), являются фундаментальными типами, а не типами классов.

Вы можете использовать NSNumber в качестве обертки или передать вместо этого NSDate.

+0

Спасибо за быстрый ответ, но вариант NSDate кажется много, как взломать мне. Будете ли вы достаточно любезны, чтобы опубликовать решение NSValue? Также, когда я попытался выполнить приведенный выше код, у меня возникла ошибка времени выполнения: *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [NSThread initWithTarget: selector: object:]: target не реализует селектор (*** - [MainScreenController StartServerSynchThread]) ' – Yousef

+0

@Yousef вы забыли ':' в конце имени метода. –

11

Это почти то же самое, что и ответ @ Georg, но с использованием подходящих типов. :)

Если ЯЩИК NSTimeInterval в NSNumber (подкласс NSValue), вы можете передать, что вместо того, чтобы:

[NSThread detachNewThreadSelector:@selector(startServerSynchThread:) 
         toTarget:self 
         withObject:[NSNumber numberWithDouble:myTimeInterval]]; 

- (void) startServerSynchThread:(NSNumber *)interval { 
    [NSThread sleepForTimeInterval:[interval doubleValue]]; 
} 
+0

Отлично! Мне нравится это решение лучше, так как более понятно, что делают аргументы метода. Также ошибка времени выполнения была исправлена ​​с помощью двоеточия (:) после имени метода «@selector (startServerSynchThread:». Спасибо Dave! – Yousef

+1

'NSNumber' конечно ... должно быть, пропал кофе :) –