objective c learning Como posso atrasar uma chamada de método por 1 segundo?



objective c official site (9)

Existe uma maneira fácil atrasar uma chamada de método por 1 segundo?

Eu tenho um UIImageView que reage em um evento de toque. Quando o toque é detectado, algumas animações acontecem no aplicativo. Depois de um segundo, quero chamar outro método. Nesse caso, não posso usar o seletor animationDidStop .


Answer #1

Já existem muitas respostas e todas estão corretas. Caso queira usar o dispatch_after você deve procurar o snippet que está incluído na Code Snippet Library na parte inferior direita (onde você pode selecionar os elementos da UI do UI ).

Então você só precisa chamar este trecho escrevendo o despacho no código:


Answer #2

NOTA: isto irá pausar todo o seu tópico, não apenas o método.
Faça uma chamada para dormir / esperar / parar por 1000 ms antes de chamar seu método?

Sleep(1000); // does nothing the next 1000 mSek

Methodcall(params); // now do the real thing

Editar: A resposta acima se aplica à pergunta geral "Como posso atrasar uma chamada de método por 1 segundo?", Que foi a pergunta feita no momento da resposta (na verdade, a resposta foi dada dentro de 7 minutos da pergunta original: )). Nenhuma informação foi dada sobre a linguagem naquele momento, então, gentilmente pare de reclamar sobre a maneira correta de usar o sono no XCode e a falta de aulas ...


Answer #3

A melhor maneira de fazer é:

[self performSelector:@selector(YourFunctionName) 
           withObject:(can be Self or Object from other Classes) 
           afterDelay:(Time Of Delay)];

você também pode passar nil como parâmetro withObject.

exemplo:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];

Answer #4

Você também pode usar um bloco

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});

Na maior parte do tempo, você desejará usar dispatch_get_main_queue, embora, se não houver uma interface do usuário no método, você possa usar uma fila global .

Editar:

Versão Swift 3:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}

Igualmente, DispatchQueue.global().asyncAfter(... também pode ser uma boa opção.


Answer #5

Você também pode:

[UIView animateWithDuration:1.0
                 animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
                 completion:^(BOOL finished)
{
    NSLog(@"A second lapsed.");
}];

Neste caso você tem que falsificar algumas alterações para alguma visão para obter o trabalho de animação. É de fato hacky, mas eu amo o material baseado em blocos. Ou encerre a resposta @mcfedr abaixo.

waitFor(1.0, ^
{
    NSLog(@"A second lapsed");
});
typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
                   dispatch_get_main_queue(), ^
    { completion(); });
}


Answer #7

Você consegue fazer isso

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];

Answer #8

Use no Swift 3

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)

Answer #9

Você pode usar o seletor de execução para depois do método de atraso de 0,1 segundo ser chamado para o código seguinte para fazer isso.

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 




uikit