سؤال

أنا التواصل مع خادم الويب لاسترداد قيمة رقمية تأتي في وظيفتي كملقم nsstring. يخبرني هذا الرقم مقدار الوقت المحدد للانتظار حتى أداء إجراء آخر، ومن الأهمية بمكان أن يكون دقيقا.

كمثال، إذا كانت السلسلة "89283"، فهذا يعني أنني يجب أن تنتظر 89.283 ثانية. لذلك أود أن أعرف أفضل طريقة في الهدف - ج-ج iPhone لتحويل هذه السلسلة إلى قيمة دقيقة يمكنني تمريرها إلى industriendector: 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 على أنه مزدوج على iPhone، حتى تتمكن من تخزين النتيجة المزدوجة في الأمر ثم اجتيازه إلى AfterDelay: جزء من المحدد.

نصائح أخرى

NstimeInterval هو مزدوج، وأنت تقوم بتقسيم عدد صحيح. فقط تغيير نوعها من int ل double ويجب أن تكون جيدا.

التأخير باستخدام حلقات تشغيل، كما أنت، أو مع NSTIMER غير دقيق للغاية لأنك يجب أن تنتظر دائما حتى تتم معالجة الحدث السابق بالكامل. عند التنفيذ، يمكن أن يكون التعليمات البرمجية الخاصة بك تشغيل 100ms أو في وقت لاحق أكثر مما تتوقع.

لذلك على الرغم من دقتك العالية، فمن المحتمل أن تفتقر الدقة بجدية.

اعتمادا على سبب الحاجة إلى هذا التوقيت الدقيق، قد تتمكن من إجراء تصحيحات على العمليات الحسابية وتقديم الفرق Moot.

لا تملك مندوبا كافيا لإضافة تعليق ولكن تأكد مما إذا كنت تقوم بتحويل MyDelay لتطفو أنك تقسم بنسبة 100.0 وإلا فلن تحصل على ما تتوقعه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top