Форум программистов, компьютерный форум CyberForum.ru

Timer - Программирование iOS/iPhone

Восстановить пароль Регистрация
 
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
28.06.2013, 14:37     Timer #1
Нужно чтобы в течение N секунд считывался и анализировался буффер. Но только N сек. Я так понимаю, что нужно использовать NSTimer. Не дадите ссылку или же привидите пример как это будет правильнее сделать. Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
28.06.2013, 20:39     Timer #2
Неважно какой буфер и неважно как анализировался?
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)fireWithDuration:(NSTimeInterval)duration {
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:_updateInterval target:self selector:@selector(onTimerFires:) userInfo:nil repeats:YES];
        _timeToStop = CFAbsoluteTimeGetCurrent() + duration;
        [_timer fire];
    }
}
 
- (NSTimeInterval)remainingTime {
    return _timeToStop - CFAbsoluteTimeGetCurrent();
}
 
- (void)onTimerFires:(NSTimer*)timer {
    NSTimeInterval time = [self remainingTime];
   /*
     Do some work here
   */
    if (time <= 0){
       [timer invalidate];
    }
}
Добавлено через 5 минут
Ну и не забудьте правильно таймер уничтожить(invalidate), занилить ссылки, ну и прочие мелкие штуки(в зависимости arc/no-arc)
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
28.06.2013, 22:01     Timer #3
Еще можно через dispatch_after сделать. Кода много меньше получится. И таймер релизить не придется ;-)
КОЗАК СЕРГІЙ
4 / 4 / 1
Регистрация: 16.10.2009
Сообщений: 38
02.07.2013, 11:22     Timer #4
mobidevelop, Уф, блоки для новичка это жесть, я отчасти сам иногда немогу разобрать их и стараюсь чем меньше использовать, есть какая-то литература для детального их описания? А то смотрел уроки и на eng. и нашол на рус. языке но так и много не понял
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
02.07.2013, 11:27     Timer #5
Дело исключительно привычки и грамотного форматирования кода. Жесть начинается когда они вкладываются :-)
А особых хитростей там нет. Только за ретейнами следить надо, чтобы они не зациклились.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
03.07.2013, 00:50     Timer #6
Цитата Сообщение от КОЗАК СЕРГІЙ Посмотреть сообщение
Уф, блоки для новичка это жесть, я отчасти сам иногда немогу разобрать их и стараюсь чем меньше использовать
шикарнейшая возможность языка, в юнит тестировании они везде, вчастности в Kiwi фреймворке, а так же очень удобны для реализации колбеков

вот оффициальная литература, далеко ходить не надо: https://developer.apple.com/library/...ceptual/Blocks

вот еще доступно расписано:
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
http://pragmaticstudio.com/blog/2010/9/15/ios4-blocks-2
КОЗАК СЕРГІЙ
4 / 4 / 1
Регистрация: 16.10.2009
Сообщений: 38
03.07.2013, 12:01     Timer #7
Vorona, Большое спасибо, сегодня покурю эти мануалы.
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
05.07.2013, 16:51  [ТС]     Timer #8
Цитата Сообщение от mobidevelop Посмотреть сообщение
Еще можно через dispatch_after сделать. Кода много меньше получится. И таймер релизить не придется ;-)
Честно говоря так и не поняла как решить мою задачу с помощью dispatch_after.
Он же вроде просто задерживает выполнение. Тогда это ничем не отличается от sleep.
А нужно чтобы он, например, 5 секунд считывал буффер, а если нашел то,что нужно раньше, то продолжил выполнение программы, если в течение 5 сек не нашел, то, значит, тоже продолжил выполнение.

Так что, к сожалению, придется юзать таймер в цикле =(
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
05.07.2013, 19:35     Timer #9
Так же, как и с таймером. Т.е. в блоке (или в методе таймера) взвести флажок хватитЧитать (или соединение закрыть).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2013, 19:40     Timer
Еще ссылки по теме:

C# Timer
C# System.Timers.Timer vs System.Threading.Timer
C++ Не удаётся связать два файла timer.h и timer.cpp
Delphi Запуск/остановка таймера при вводе в Edit команд Timer Start/Timer Stop
PascalABC.NET Timer vs System.Windows.Forms.Timer

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
09.07.2013, 19:40  [ТС]     Timer #10
Всем спасибо.
Вот, что получилось.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
NSMutableString bufferAnswer;
bool isBufferAnalysed;
+(void) waitAnalys:(NSArray*) strInArray
{
    isBufferAnalysed=false;
    NSMutableString *str;
    
    while (!isBufferAnalysed)
    {
        str=[BufferClass getCurrentStr];
        if(![str isEqualToString:@""])
        {
            /* анализ буфера (у меня там цикл) */
              if(/*условие при котором анализ завершается*/)
               {
                    isBufferAnalysed=true;
                    break;
               }
            /* конец анализа */
        }
    }
    bufferAnswer=str;
 }
+ (void) interruptAnalys
{
    isAnalysed=true;
}
+ (NSMutableString*) analysateBuffer
{
    double delayInSeconds = 10.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if(!isAnswerCame)
        {
            [BufferCom interruptAnalys];
        }
    });
    [BufferCom waitAnalys:strIn];
    return bufferAnswer;
}
Добавлено через 1 час 11 минут
И еще один вопрос. С точки зрения чистого кода, как правильнее писать в методе...
Например,
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@implementation MyClass : NSObject
 
+(void) method
{
 
}
 
+(void) mainMethod
{
    [self method];      // 1
    [MyClass method]; // 2
}
 
@end
Какой вариант корректее?
Я думаю, что 2. Это же метод класса, а не объекта.

Добавлено через 16 минут
Цитата Сообщение от di_ingenio Посмотреть сообщение
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
* * * * if(!isAnswerCame)
* * * * {
* * * * * * [BufferCom interruptAnalys];
* * * * }
* * });
Если проходит больше 1 секунд, то должен выполниться этот участок кода. Но, к сожалению, не выполняется. Подскажите, где косяк?
Yandex
Объявления
09.07.2013, 19:40     Timer
Ответ Создать тему
Опции темы

Текущее время: 07:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru