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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top