iphoneobjective-ccocoa-touchnslock

Cocoa thread synchronisation when using [ALAssetsLibrary enumerateGroupsWithTypes:]


I have recently, like a few people, discovered that [ALAssetsLibrary enumerateGroupsWithTypes] likes to run its blocks on another thread. What a shame that Apple didn't document that :-)

In my current circumstance I need to wait for the enumeration to complete, before the main thread returns any results. I clearly need some sort of thread synchronisation.

I've read about NSLock & NSConditionLock, but nothing yet seems to fit the requirement of 'signal a blocked thread that this worker thread has completed'. It seems like a simple enough need - can anyone point me in the right direction?

Your clue & boos, are most welcome as always,

M.


Solution

  • The answer is to use the NSConditionLock class thusly ...

    typedef enum {
        completed = 0,
        running = 1
    } threadState;
    
    ...
    
    NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:running];
    

    Then spin off your thread, or in my case a call to [ALAssetsLibrary enumerateGroupsWithTypes:]. Then block the parent thread with this ...

    // Await completion of the worker threads 
    [lock lockWhenCondition:completed];
    [lock unlockWithCondition:completed];
    

    When all work is done in the child/worker thread, unblock the parent with this ...

    // Signal the waiting thread
    [lock lockWhenCondition:running];
    [lock unlockWithCondition:completed];