Convertendo o NSString em número preciso para o PerformSelector: AfterDelay:
-
16-09-2019 - |
Pergunta
Estou me comunicando com um serviço da web para recuperar um valor numérico que entra na minha função como uma NSString. Esse número me diz a quantidade precisa de tempo para esperar até que eu execute outra ação, e é fundamental que seja preciso.
Como exemplo, se a string for "89283", isso significa que devo esperar 89.283 segundos. Então, eu gostaria de saber a melhor maneira do Objective-C para o iPhone converter essa string em um valor preciso que eu posso passar para o PerformElector: AfterDelay: function. Aqui está o meu código de amostra, mas acho que não é preciso.
NSString *myDelayString = @"89283";
int myDelay = [myDelayString intValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];
Eu acho que o valor do myDelay realmente deve ser um interinterval, mas não tenho certeza de como fazer isso da string que tenho. Desde já, obrigado.
Solução
Aqui está o código com alterações para permitir a dupla precisão.
NSString *myDelayString = @"89283";
NSTimeInterval myDelay = [myDelayString doubleValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];
Use DoubleValue para obter a string como uma dupla para evitar a divisão inteira. O tipo do NSTimeInterval é definido como um dobro no iPhone, para que você possa armazenar o resultado duplo nele e depois passá -lo para o AfterDelay: parte do seletor.
Outras dicas
O NSTimeInterval é um duplo e você está fazendo uma divisão inteira. Basta mudar seu tipo de int
para double
E você deve ser bom.
Atrasos usando loops de corrida, como você é, ou com o NSTIMER, são muito imprecisos, porque você deve sempre esperar que o evento anterior seja totalmente processado. Ao executar, seu código pode estar executando 100ms ou mais mais tarde do que você espera.
Portanto, apesar de sua alta precisão, a precisão provavelmente estará seriamente falta.
Dependendo do motivo pelo qual você precisa desse tempo preciso, você poderá fazer correções com seus cálculos e renderizar a diferença.
Não tenha representante suficiente para adicionar um comentário, mas verifique se você converte o mydelay para flutuar que divide por 100.0, caso contrário, não conseguirá o que espera.