2016-06-18 3 views
1
IOS에

, 내가 가지고있는 NSArray 저장 blocks 그 예를 들어,있는 UIView에 뭔가를 그리기 :CGContext를 블록으로 그릴 수 있습니까?

^(CGContextRef ctx) { 
    // drawing rectangle 
    CGRect rect = CGRectMake(0, 0, 300, 300); 
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); 
    CGContextFillRect(ctx, rect); 
    CGContextStrokeRect(ctx, rect); 
}; 

가 배열에 저장된 여러 블록, 그리고 내가 drawRect가 불려 갔을 때 그 블록이 sequently 실행 기대, 여기 내 drawRect

- (void)drawRect:(CGRect)rect { 
    // execute blocks 
    for(NSDictionary * task in drawTaskQueue) 
    { 
     DrawTaskBlock block = [task objectForKey:@"block"]; 
     block(args, UIGraphicsGetCurrentContext()); 
    } 
} 

있어하지만이 코드를 실행하면, 나는 블록이 에러없이 실행있어 확신 해요,하지만 아무것도 게재되지 않습니다. 내가 뭔가를 놓친 건가?

+1

'DrawTaskBlock'은 어떻게 정의되어 있습니까? – dasblinkenlight

+1

블록이 백그라운드 스레드에서 실행 중이며 메인 스레드에서 실행하려고 시도한 것으로 보입니다. UI 업데이트를 허용하는 유일한 스레드입니다. – azimov

+2

@azimov 호출은'drawRect'에서 오는 것이므로 올바른 스레드에 있습니다. – dasblinkenlight

답변

2

코드의 문제점은 호출하는 코드가 argsUIGraphicsGetCurrentContext()이라는 두 개의 인수를 전달하는 동안 전달하는 블록에 CGContextRef 유형의 단일 매개 변수가 필요하다는 것입니다.

Objective-C가 캐스트를 검사하지 않기 때문에 블록이 잘못된 그래픽 컨텍스트로 실행되어 정의되지 않은 동작이 발생합니다.

이 문제를 해결하려면 블록의 '서명'이 전송하려는 블록 유형의 서명 (예 : DrawTaskBlock)과 일치해야합니다. 서명에 args 매개 변수의 적절한 유형이 포함되어야합니다 (블록 중 어느 것도 사용하지 않는 경우에도).