Domanda

I will be very short:

I'am drawing lines using drawrect and NSBezierPath.

To draw these lines I am using a for loop.

Now, since the loop takes many seconds,I'm trying to use a NSProgresIndicator to show the progress and to update it within the loop I used dispatch_async & queue.. The ProgressIndicator updates but nothing is being drawn.. If don't use the queue the lines are drawn but the indicator updates at the end of the cycle.

What am I doing wrong ?

The error:

<Error>: CGContextRestoreGState: invalid context 0x0. 
This is a serious error. 
This application, or a library it uses, is using an invalid context
and is thereby 
contributing to an overall degradation of system stability and reliability.
 This notice is a courtesy: please fix this problem.
 It will become a fatal error in an upcoming update.

// SAMPLE OF CODE
dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
dispatch_async(myQueue, ^
               {
for (int i = 1; i <= 200; i++) {

    dispatch_async(dispatch_get_main_queue(), ^{
        [istance set_progress:i]; 
//This sets the progress, but bezierPath doesn't work
    });


//Bezier already alloc & init
[my_path moveToPoint....]
[my_path lineToPoint....]
[my_path stroke]

}
               });
È stato utile?

Soluzione

In general you shouldn't be drawing on a background thread or queue.

Please read this document for information about multithreaded drawing. Skip to "Drawing Restrictions"

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top