2011-11-29 15 views
7

मैं एक्सेलेरोमीटर डेटा पुनर्प्राप्त करने के लिए CMMotionManager का उपयोग कर रहा हूं। बात यह है कि एक्सेलेरोमीटर डेटा समय-समय पर मुद्रित हो जाता है, उदाहरण में आवृत्ति चर बदल जाते हैं, लेकिन दृश्य को फिर से नहीं लिया जाता है। मैंने जांच की है कि hv शून्य नहीं है और यह सब कुछ जुड़ा हुआ है। क्या ब्लॉक के भीतर setNeedsDisplay को कॉल करने में कोई समस्या है?setNeedsDisplay ब्लॉक के अंदर काम नहीं कर रहा है

-(void) viewDidAppear:(BOOL) animated 
{ 
    [super viewDidAppear: animated]; 

    [motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler: 
    ^(CMAccelerometerData *accelerometerData, NSError *error) 
    { 

     NSLog(@"%@",accelerometerData); 

     HypnosisView *hv = (HypnosisView *) [self view]; 

     hv.xShift = 10.0 * accelerometerData.acceleration.x; 
     hv.yShift = -10.0 * accelerometerData.acceleration.y; 

     [hv setNeedsDisplay]; 

    }];  
} 

उत्तर

12

ऐसा इसलिए है क्योंकि आप थ्रेड पर यूआई विधि को मुख्य थ्रेड से अलग करते हैं।

अपने ब्लॉक करने के लिए इस जोड़ें:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [hv setNeedsDisplay]; 
}); 

याद रखें उपयोगकर्ता इंटरफ़ेस तत्वों मुख्य थ्रेड से बुलाया जाना चाहिए के साथ काम है कि किसी भी विधि।

+0

ब्लॉक में ब्लॉक, मुझे पसंद है। :) – Pascal

+0

समस्या हल करने के लिए – jorurmol

+0

समाधान हल किया। क्योंकि मैं बाहरी व्यक्ति हूं, यहां लोगों के बारे में जानकारियों के लिए वास्तव में अच्छा है। –

4

मैंने अन्य ब्लॉक में भी ऐसा किया है और यह काम किया है, हालांकि कॉलबैक के साथ आप यहां उपयोग नहीं करते हैं। शायद मुख्य धागे पर ब्लॉक निष्पादित नहीं किया गया है? आप देख सकते हैं कि साथ:

NSLog(@"Main thread? %d", [NSThread isMainThread]); 

यदि ऐसा नहीं है, तो आप setNeedsDisplay मुख्य थ्रेड पर चलाने के लिए मजबूर कर सकता है।

+0

हाँ, यह समस्या है, धन्यवाद! – jorurmol

0

बस @ कोकोएरो के जवाब का परीक्षण करना चाहता था। मैंने एक गैर मुख्य थ्रेड में UIButton के लिए setTitle पर कॉल करने का प्रयास किया। और शीर्षक बदल गया। मैंने Xcode 5.0.1 का उपयोग करके आईओएस 5.1 और 7.0 दोनों को लक्षित करने की कोशिश की। इसके अलावा मैंने एक गैर मुख्य धागे से setNeedsDisplay कहा और यह भी काम किया।

[NSThread isMainThread] यह था कि मैंने कैसे सुनिश्चित किया कि मेरी कॉल मुख्य धागे से नहीं थी। मुझे यकीन नहीं है कि गैर मुख्य धागे से कॉल करना आपकी समस्या का कारण था लेकिन कम से कम वहां अन्य संभावनाएं हैं। आप किसी अन्य प्रश्न के लिए my answer पर एक नज़र डाल सकते हैं।

संबंधित मुद्दे