cancelando o performSelector na fila: chamadas afterDelay

115

alguém sabe se é possível cancelar eventos do seletor já enfileirados da pilha de eventos ou da pilha do cronômetro (ou de qualquer mecanismo utilizado pela API) quando você chama performSelector:withObject:afterDelay?

Eu estava usando essa pilha de eventos para alterar os atributos de uma imagem dentro de uma guia TabBar e às vezes enfileirava até 10 segundos de alterações em um loop executado rapidamente ... talvez 5 milissegundos ou mais.

o problema surge se o usuário alternar as guias ... digamos, tenho as alterações de imagem enfileiradas para uma imagem que é exibida assim que a guia nº 4 é ativada e, em seguida, o usuário muda rapidamente para a guia nº 3 e depois volta para a guia # 4 ... isso iria então re-enfileirar mais 10 segundos no valor de alterações enquanto a fila antiga ainda estava tocando, provavelmente cerca de 2 ou 3 segundos na fila se trocada rápido o suficiente ... mas mesmo chegando a 5 segundos para o fluxo era um problema.

então eu precisava de alguma forma de cancelar a pilha antiga de alterações antes de colocar uma nova pilha ...

Estou escrevendo esta consulta no tempo passado porque já encontrei uma solução alternativa para esse problema adicionando um filtro de eventos com olhos de falcão na função de reprodução. no entanto, ainda estou curioso para saber se o cancelamento do evento é possível, porque tenho a sensação de que esse conhecimento será útil no futuro. obrigado por qualquer ajuda prestada :)

eerok512
fonte
como você poderia usar o filtro de eventos com olhos de falcão na função de reprodução?
Maniganda saravanan

Respostas:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

ou

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

O targeté o objeto original no qual performSelector:afterDelay:foi chamado.

Por exemplo:

// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];

Veja a documentação da apple , está bem no final da performSelector:withObject:afterDelay:descrição.

StefanB
fonte
33
Para algum esclarecimento sobre seu uso, tente isto: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) object: nil];
webtrick101
2

Para cancelar todas as solicitações de execução anteriores, você pode usar:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
fonte
2

Se você estiver procurando por "performSelector" para ter sua correspondência " cancelPreviousPerformSelector" ... não tem. (Ugh, Apple, por que você faz isso comigo ???)

Os, er, ah, métodos de "correspondência" são:

performSelector

cancelPreviousPerformRequestsWithTarget

(Apenas para torná-lo ainda mais difícil de lembrar, sem pesquisar os documentos.)

Irene
fonte
1

Verifique os documentos NSRunLoop. Você quer-cancelPerformSelectorsWithTarget:

NSResponder
fonte