преобразование NSString в точное число для PerformSelector:послеДелей:

StackOverflow https://stackoverflow.com/questions/1863881

Вопрос

Я общаюсь с веб-сервисом, чтобы получить числовое значение, которое входит в мою функцию как NSString.Это число указывает мне точное время ожидания, пока я не выполню другое действие, и очень важно, чтобы оно было точным.

Например, если строка «89283», это означает, что мне нужно подождать 89,283 секунды.Поэтому я хотел бы знать, как лучше всего в Objective-C для iPhone преобразовать эту строку в точное значение, которое я могу передать в PerformSelector:afterDelay:функция.Вот мой пример кода, но я предполагаю, что он неточен.

NSString *myDelayString = @"89283";
int myDelay = [myDelayString intValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];

Я думаю, что значение myDelay действительно должно быть NSTimeInterval, но я не уверен, как это сделать из имеющейся у меня строки.Заранее спасибо.

Это было полезно?

Решение

Вот код с изменениями, обеспечивающими двойную точность.

NSString *myDelayString = @"89283";
NSTimeInterval myDelay = [myDelayString doubleValue]/1000;
[self performSelector:@selector(myFunction) withObject:nil afterDelay:myDelay];

Используйте doubleValue, чтобы получить строку как двойную, чтобы избежать целочисленного деления.Тип NSTimeInterval определен как double на iphone, поэтому вы можете сохранить в него результат double, а затем передать его в afterDelay:часть селектора.

Другие советы

NSTimeInterval является двойным, и вы выполняете целочисленное деление.Просто измените его тип с int к double и тебе должно быть хорошо.

Задержки с использованием циклов выполнения, как у вас, или с помощью NSTimer очень неточны, поскольку вы всегда должны ждать полной обработки предыдущего события.При выполнении ваш код может выполняться на 100 мс или более позже, чем вы ожидаете.

Таким образом, несмотря на вашу высокую точность, точности, скорее всего, будет серьезно недоставать.

В зависимости от того, почему вам нужно такое точное время, вы можете внести поправки в свои расчеты и сделать разницу спорной.

у вас недостаточно представителей, чтобы просто добавить комментарий, но убедитесь, что если вы преобразуете myDelay в число с плавающей запятой, вы разделите его на 100,0, иначе вы не получите то, что ожидаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top