преобразование NSString в точное число для executeSelector: afterDelay: - PullRequest
0 голосов
/ 08 декабря 2009

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 08 декабря 2009

Вот код с изменениями для обеспечения двойной точности.

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

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

1 голос
/ 08 декабря 2009

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

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

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

1 голос
/ 08 декабря 2009

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

0 голосов
/ 08 декабря 2009

не хватает представителя, чтобы просто добавить комментарий, но убедитесь, что если вы конвертируете myDelay в float, то вы поделите на 100.0, иначе вы не получите то, что ожидаете.

...