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

Objective-C

Войти
Регистрация
Восстановить пароль
 
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
#1

Как использовать dispatch_after? - Objective-C

23.07.2013, 20:19. Просмотров 1023. Ответов 5
Метки нет (Все метки)

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
{
    isBufferAnalysed=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;
}
По идее, если по истечении 10 секунд буффер не закончил анализироваться, то анализ должен прерваться, т.е. выполняться вот это
Objective-C
1
2
3
4
if(!isAnswerCame)
        {
            [BufferCom interruptAnalys];
        }
Но к сожалению, не выполняется. Подскажите, где косяк?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 20:19     Как использовать dispatch_after?
Посмотрите здесь:

Для чего нужен NSRunLoop и как его использовать? Objective-C
Objective-C Сколько максимум оперативной памяти желательно использовать приложению?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
23.07.2013, 21:04     Как использовать dispatch_after? #2
Objective-C
1
[BufferCom waitAnalys:strIn];
надо заменить на
Objective-C
1
2
3
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
[BufferCom waitAnalys:strIn];
});
Должно помочь. Судя по всему, waitAnalys выполняется в главном потоке. И до блока с interruptAnalys очередь просто не доходит.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
23.07.2013, 22:00     Как использовать dispatch_after? #3
вот еще доходчиво написано про диспатчи, after в том числе - http://idev.by/ios/21137/
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
24.07.2013, 13:51  [ТС]     Как использовать dispatch_after? #4
Цитата Сообщение от Vorona Посмотреть сообщение
вот еще доходчиво написано про диспатчи, after в том числе - http://idev.by/ios/21137/
Именно по этому и делала. Но не работает=(
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.07.2013, 15:19     Как использовать dispatch_after? #5
А мой фикс тоже не работает?
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
24.07.2013, 16:24  [ТС]     Как использовать dispatch_after? #6
Цитата Сообщение от mobidevelop Посмотреть сообщение
А мой фикс тоже не работает?
вы наверное имели ввиду
Objective-C
1
2
3
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^(void){
//код
});
Он немедлено передает управление дальше, ставя задачу в очередь.
А мне нужно, чтобы ждал, либо 10 секунд, либо, раньше,если анализ закончился.

Добавлено через 11 минут
Прошу прощения. Я все исправила.

Objective-C
1
2
3
4
5
6
7
8
9
10
dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        if(!isBufferAnalysed)
        {
            [BufferCom interruptAnalys];
        }
    });
    [Socket sendMessage:str];
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^(void){
       [BufferCom waitAnalys:strIn];
    });
Дело было в том, что они, наверное, в разных очередях были =)
Yandex
Объявления
24.07.2013, 16:24     Как использовать dispatch_after?
Ответ Создать тему
Опции темы

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