Таймер, вызывающий зависание приложения в некоторых ситуациях

Вот код:

- (IBAction) startRecognition:(id)sender {
    backgroundSoundLevel = [backgroundSoundChange stringValue];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
}

- (void)timerFired:(NSTimer*)theTimer
{   
    NSString *charlieSoundVolume = [charlieSoundLevel stringValue];
    if ([charlieSoundVolume isLessThan: backgroundSoundLevel]) {
        NSRunAlertPanel(@"", charlieSoundVolume, @"", @"", @"");
    }
}

Поэтому, когда вы нажимаете кнопку «startRecognition», он запускает этот цикл таймера «таймер запущен». НО, когда значение charlieSoundVolume меньше backgroundSoundLevel, приложение зависает. Когда больше, работает нормально. Значит, что-то не так с этой частью кода. Я не совсем уверен, что...

Справочная информация: charlieSoundVolume — это текущий объем, выраженный в NSString. backgroundSoundVolume также выражается в NSString. charlieSoundVolume — это текущая громкость, а backgroundSoundVolume — предустановленная громкость, установленная NSSlider backGroundSoundChange.

Любые идеи??

Элайджа


person objectiveccoder001    schedule 05.07.2010    source источник
comment
Когда вы говорите, что приложение зависает, вы имеете в виду, что панель не отображается и приложение перестает отвечать или что?   -  person Chuck    schedule 05.07.2010
comment
Да, панель не появляется, у меня крутится радуга и приложение перестает отвечать. Что ты имеешь в виду? Я использую это, чтобы сказать, меньше ли одна NSString, чем другая NSString.   -  person objectiveccoder001    schedule 05.07.2010
comment
Я исправил ваш заголовок и теги. В будущем выбирайте более описательные заголовки и более подходящие теги. (Кроме того, рассмотрите имя пользователя, которое не выдает себя за кого-либо. Анонимность — это хорошо, а выдача себя за другое — нет.)   -  person Chris Hanson    schedule 05.07.2010
comment
Хорошо спасибо! Но это мое настоящее имя... Я знаю, что оно такое же, как и у актеров, но я мало что могу с этим поделать :D   -  person objectiveccoder001    schedule 05.07.2010
comment
Закомментируйте свой NSRunAlertPanel и добавьте что-нибудь еще. Вы сами сказали, что это проблема. Начните с этого.   -  person Jason McCreary    schedule 05.07.2010
comment
Это не проблема. Я вынул его, все равно зависает приложение.   -  person objectiveccoder001    schedule 05.07.2010
comment
Элайджа Вуд: Не следует обращаться со строками как с числами, особенно для числового сравнения. «100» меньше «50». Получите значения double строк и сравните их, используя оператор C меньше чем.   -  person Peter Hosey    schedule 05.07.2010
comment
Можете ли вы опубликовать пример в качестве ответа?   -  person objectiveccoder001    schedule 05.07.2010
comment
Элайджа Вуд: Если ваше приложение зависло, попробуйте его, используя Монитор активности (тот же инструмент, который используют пользователи) или Инструменты. Это скажет вам, что он делает. Вы должны знать, что он делает, чтобы знать, как заставить его прекратить это делать.   -  person Peter Hosey    schedule 05.07.2010
comment
Элайджа Вуд: Как правило, я не пишу примеры — ваша задача написать код; мой как ответчик должен сказать вам, что вам нужно (или следует и не следует) писать. Вам нужно запросить у объектов NSString их значения double и сравнить эти значения с помощью оператора C "меньше". Вы можете посмотреть первую часть в документации (см. меню «Справка» Xcode), и вы уже должны знать вторую часть, так как вам нужно знать хотя бы базовый C для эффективного использования Cocoa. Если нет, рекомендую эту книгу: oreilly.com/catalog/9780596804794   -  person Peter Hosey    schedule 05.07.2010
comment
Я ПОНЯЛ!!! Я отправляю правильный код в качестве ответа.   -  person objectiveccoder001    schedule 05.07.2010
comment
Элайджа, прошу прощения, я видел много людей в других местах в Интернете, которые делают это. Я отредактирую свой комментарий, если смогу.   -  person Chris Hanson    schedule 05.07.2010
comment
О, нет проблем! Я знаю, что Вы имеете ввиду! : D и кстати, большое спасибо за вашу помощь. Вы ответили очень быстро, и ваши ответы помогут мне лучше понять цель-с. Я БУДУ ГЕНИЕЙ! :D Еще раз спасибо! Элайджа   -  person objectiveccoder001    schedule 05.07.2010


Ответы (1)


Вот рабочий код:

- (IBAction) startRecognition:(id)sender {
    timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
}

- (void)timerFired:(NSTimer*)theTimer
{   
    backgroundSoundLevel = [backgroundSoundChange stringValue];
    NSString *charlieSoundVolume = [charlieSoundLevel stringValue];
    if ([charlieSoundVolume  isLessThan: backgroundSoundLevel]) {
        NSRunAlertPanel(@"", charlieSoundVolume, @"", @"", @"");
    }
}
person objectiveccoder001    schedule 05.07.2010
comment
Итак, backgroundSoundLevel — это строка, а charlieSoundLevel — это элемент управления? Вам нужно более четко назвать ваши переменные. (И прекратите хранить данные в элементах управления! Ваш объект контроллера должен напрямую владеть одним или обоими этими объектами-значениями.) - person Peter Hosey; 05.07.2010
comment
Да. backgroundSoundLevel — это значение, которое создает NSSlider. charlieSoundLevel — это значение NSTextField (которое представление кварцевого композитора изменяется с помощью патча, этот файл представления кварцевого композитора является шаблоном визуализатора, который просто получает уровень звука). Немного запутанно, но ВСЕ приложение теперь работает ОТЛИЧНО! Итак, я посмотрю на это и сделаю его более эффективным. :D - person objectiveccoder001; 05.07.2010
comment
Согласно коду в вашем ответе, charlieSoundLevel - это не значение NSTextField, а сам элемент управления (возможно, текстовое поле). - person Peter Hosey; 05.07.2010