Eu sou um novato no iOS. Eu tenho um método seletor da seguinte forma -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Estou tentando implementar algo assim -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Mas isso me dá um erro ao dizer -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Alguma ideia do que estou perdendo?
iphone
ios
selector
performselector
Suchi
fonte
fonte
invoke
, ligue:[inv performSelector:@selector(invoke) withObject:nil afterDelay:1];
Devo concordar que essa é uma ótima solução. Feliz codificação a todos!Porque não existe
[NSObject performSelector:withObject:withObject:afterDelay:]
método.Você precisa encapsular os dados que deseja enviar em algum objeto Objective C único (por exemplo, um NSArray, um NSDictionary, algum tipo Objective C personalizado) e, em seguida, passá-los através do
[NSObject performSelector:withObject:afterDelay:]
método que é bem conhecido e amado.Por exemplo:
fonte
NSNumber * whatToDoNumber = [NSNumber numberWithBool: doThis];
") e passe-o adiante como um parâmetro, @virata.Você pode empacotar seus parâmetros em um objeto e usar um método auxiliar para chamar seu método original como Michael e outros agora sugeriram.
Outra opção é dispatch_after, que pegará um bloco e o enfileirará em um determinado momento.
Ou, como você já descobriu, se não precisar do atraso, você pode apenas usar
- performSelector:withObject:withObject:
fonte
__weak
para dar ao seu temporizador fingido apenas um elo fraco de volta para si mesmo - assim, você não acaba estendendo artificialmente o ciclo de vida do seu objeto e, por exemplo, se o seu desempenhoSeletor: afterDelay: afeta algo um pouco como cauda recursão (embora sem a recursão) então ele resolve o ciclo de retenção.A opção mais simples é modificar seu método para pegar um único parâmetro contendo ambos os argumentos, como um
NSArray
ouNSDictionary
(ou adicionar um segundo método que pega um único parâmetro, desempacota-o e chama o primeiro método e, em seguida, chama o segundo método em um demora).Por exemplo, você poderia ter algo como:
E então, para chamá-lo, você pode fazer:
fonte
NSDictionary
perde a segurança de tipo. Não é ideal.performSelector:
(ouNSInvocation
). Se isso for uma preocupação, a melhor opção provavelmente seria passar pelo GCD.e chamá-lo com:
fonte
Você pode encontrar todos os tipos de métodos performSelector: fornecidos aqui:
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html
Existem várias variações, mas não existe uma versão que aceite vários objetos e também um atraso. Em vez disso, você precisará agrupar seus argumentos em um NSArray ou NSDictionary.
fonte
Não gosto da forma NSInvocation, muito complexa. Vamos mantê-lo simples e limpo:
fonte
Acabei de fazer alguns swizzling e precisei chamar o método original. O que fiz foi fazer um protocolo e lançar meu objeto a ele. Outra forma é definir o método em uma categoria, mas precisaria da supressão de um aviso (#pragma clang diagnostic Ignorado "-Wincomplete-implementação").
fonte
Uma maneira simples e reutilizável é estender
NSObject
e implementaralgo como:
fonte
Gostaria apenas de criar um objeto personalizado contendo todos os meus parâmetros como propriedades e, em seguida, usar esse único objeto como o parâmetro
fonte