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

Вызов функции после некоторого времени - Objective-C

Восстановить пароль Регистрация
 
BohdanSavych
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 44
13.10.2015, 12:33     Вызов функции после некоторого времени #1
У меня есть функция котороя обновляет интерфейс.Она меняет поле Title,BackGroundImage.
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(void)setCardWrap:(NSUInteger)index//need to update all view
{
    for(UIButton* but in self.buttons)
    {
        index=[self.buttons indexOfObject:but];
        if([[[self.buttons objectAtIndex:index] currentTitle]isEqualToString:@""]==true
           &&[[self.deck getCardAtIndex:index]isChecked]==YES)
        {
            [[self.buttons objectAtIndex:index] setTitle:[[self.deck getCardAtIndex:index]getPresentDataAboutCurrentCard]
                                            forState:UIControlStateNormal];
            [[self.buttons objectAtIndex:index] setBackgroundImage:[UIImage imageNamed:@"frontCard"] forState:UIControlStateNormal];
        }
        else if( [[self.deck getCardAtIndex:index]isChecked]==NO
            &&[[self.deck getCardAtIndex:index]isMatched]==NO)
        {
            [[self.buttons objectAtIndex:index] setTitle:@""
                                            forState:UIControlStateNormal];
            [[self.buttons objectAtIndex:index] setBackgroundImage:[UIImage imageNamed:@"cardback-legendrank"] forState:UIControlStateNormal];
        }
    }
}
Мне нужно чтобы она исполнялась после некоторого времени.Не придумав ничего лучше чем sleep.
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (IBAction)onCardClick:(UIButton *)sender {
    BOOL needToOverTurn=NO;
    if([self.deck compareCurrentCardWithDeck:[self.buttons indexOfObject:sender]]==NO&&[self.deck countOfCheckedCards]!=0)
    {
        needToOverTurn=YES;
    }
    NSUInteger index=[self.buttons indexOfObject:sender];
    [self.deck choseCard:index];
     [self setCardWrap:index];
    if(needToOverTurn==YES)
    {
        sleep(3);
         [self.deck overturnNotMathedCards];
        
    }
    [self setCardWrap:index];
    
    
}
Но есть одна проблема кнопки не успевают изменить надпись и фон.Но все работает.Может есть другой способ вызывать функ. после некоторого времени?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2015, 12:33     Вызов функции после некоторого времени
Посмотрите здесь:

Вызов метода Obj-C Objective-C
Objective-C Вызов объекта в keyDown
Objective-C ! перевод времени в переменную
Вызов метода с возвратом значения Objective-C
Вызов метода из другого класса Objective-C
Вызов блока с переменными параметрами Objective-C
Вызов метода базового класса, если он был переопределён в наследнике Objective-C

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
13.10.2015, 15:31     Вызов функции после некоторого времени #2
performSelector: withObject: afterDelay:
или
dispatch_after
BohdanSavych
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 44
13.10.2015, 16:45  [ТС]     Вызов функции после некоторого времени #3
Objective-C
1
 [self performSelector:@selector(setCardWrap:index:)     withObject:self afterDelay:2];
Наверно ,я что-то делаю неправильно,так ка не работает и вылетает програма.
Митя800
46 / 46 / 12
Регистрация: 13.07.2015
Сообщений: 156
13.10.2015, 18:25     Вызов функции после некоторого времени #4
BohdanSavych, сигнатура метода
Objective-C
1
setCardWrap:
а не
Objective-C
1
setCardWrap:index:
а параметр withObject принимает конкретный index, и лучше его сделать типом NSNumber.
BohdanSavych
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 44
13.10.2015, 18:59  [ТС]     Вызов функции после некоторого времени #5
Cпасибо.Исправил на
Objective-C
1
NSNumber *numb=[[NSNumber alloc]initWithInt:index];
Objective-C
1
[self performSelector:@selector(setCardWrap:)withObject:numb afterDelay:20];
Теперь не вылетает,но дальше не работает(
BohdanSavych
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 44
15.10.2015, 09:12  [ТС]     Вызов функции после некоторого времени #6
Решил проблему.Может кому-то надо будет
Objective-C
1
2
3
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
<#code to be executed after a specified delay#> 
});
Yandex
Объявления
15.10.2015, 09:12     Вызов функции после некоторого времени
Ответ Создать тему
Опции темы

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