مقياس التسارع iPhone: didaccelerate: يبدو أنه لا يتم استدعاؤه أثناء تشغيل حلقة

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

سؤال

سؤال متعلق مقياس التسارع. (آسف ، قد لا يبدو التنسيق بشكل صحيح ، إنها المرة الأولى التي أستخدم فيها هذا الموقع). حصلت على مقياس التسارع كما هو متوقع باستخدام الرمز القياسي

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1;   //I also tried other update values

يمكنني استخدام NSLog لتسجيل كل مرة تسارع مقياس التسارع: didaccelerate: الطريقة في صفي تسمى. يتم استدعاء الوظيفة كما هو متوقع وكل شيء يعمل بشكل جيد حتى هنا.

ومع ذلك ، عندما أقوم بتشغيل حلقة ، لا يبدو أن الطريقة أعلاه يتم استدعاؤها. شيء من هذا القبيل

float firstAccelValue = globalAccel; //this is the x-accel value (stored in a global by the above method)
float nextAccelValue = firstAccelValue;

while (nextAccelValue == firstAccelValue){

    //do something
    nextAccelValue = globalAccel; // note globalAccel is updated by the accelerometer method

}

لا تخرج الحلقة أعلاه أبدًا ، بشكل متوقع منذ مقياس التسارع: didaccelerate: لا يتم استدعاء الطريقة ، وبالتالي Globalaccel لا تتغير أبدًا.

إذا استخدمت حالة ثابتة لكسر الحلقة ، يمكنني أن أرى ذلك بعد انتهاء الحلقة ، تعمل مكالمات الطريقة بشكل جيد مرة أخرى.

هل أفتقد شيئًا واضحًا هنا؟ أم أن طريقة مقياس التسارع لا تطلق النار عند إجراء معالجة معينة؟

أي مساعدة سيكون موضع تقدير كبير! شكرًا!

لا يوجد حل صحيح

نصائح أخرى

(لا تقارن float مع ==.)

تحتل وحدة المعالجة المركزية الحلقة وليس لديها وقت لإعطائك قيمة التسريع المحدثة.

حيث -accelerometer:didAccelerate: يُطلق عليه في كل مرة يتغير فيها التسارع ، فلماذا لا تستخدم فقط if?

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}

شكرا جزيلا على ذلك! (حول مقارنة التعويم ، نعم أفهم ، لقد كان مجرد مثال).

في الواقع ، ما أريد القيام به هو: بعد الضغط على زر ، أريد الحصول على قيمة مقياس التسارع (FirstValue) ثم انتظر حتى يتغير (لقول قيمة معينة نسبة إلى القيمة الأولى) ثم المتابعة للقيام ببعض المهام. على هذا النحو كنت أستخدم حلقة الوقت. (الحلقة التي أظهرها فقط تنتظر حتى تتغير ، لكن يمكنني وضع شرط التغيير الدقيق المطلوب بمجرد عمله).

من إجابتك ، أفهم أنه يمكنني تنفيذ المهمة في مقياس التسجيل: didaccelerate: الوظيفة نفسها (نظرًا لأنه يمكنه الوصول إلى جميع البيانات التي يحتاجها ، يمكنني جعلها تصل إلى متغير يشير إلى ما إذا كان الزر قد تم الضغط عليه). شكرا جزيلا لذلك. أعتقد أنه يمكنني جعلها تعمل بهذه الطريقة.

ولكن مجرد فضول - هل هناك طريقة للقيام بذلك خلاف ذلك؟ إذا كانت المعالجة الكثير من المعالجة ، فهل يمكنني إجبارها على تحديث مقياس التسارع بطريقة أو بأخرى؟ تعد الحلقة التي تعتبر وحدة المعالجة المركزية نفسها أولوية منخفضة لأنها كانت مجرد طريقتي في الانتظار حتى تتغير القيمة.

شكرًا لك مرة أخرى!

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