2011-11-29 6 views
7

가속도계 데이터를 검색하는 데 CMMotionManager을 사용하고 있습니다. 문제는 가속도계 데이터가 주기적으로 인쇄되고 인스턴스 변수가 뷰에서 변경되지만 뷰가 다시 그려지지 않는다는 것입니다. 나는 hv이 0이 아니며 모든 것이 연결되어 있는지 확인했습니다. 한 블록 내에서 setNeedsDisplay를 호출하는 데 문제가 있습니까?setNeeds 블록 내에서 디스플레이가 작동하지 않습니다.

-(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

주 스레드와 다른 스레드에서 UI 메서드를 호출했기 때문입니다.

은 블록이 추가 :
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을 사용하여 iOS 5.1 및 7.0을 모두 타겟팅했습니다. 또한 비 주 스레드에서 setNeedsDisplay라고 부르며 작동했습니다.

[NSThread isMainThread]

내가 내 전화는 메인 스레드에서되지 않았 음을 확인했다 방법이었다. 내가 아닌 주 스레드에서 호출하여 문제의 원인을 모르겠지만 적어도 거기에 다른 가능성이 있습니다. 다른 질문은 my answer을 참조하십시오.

관련 문제