When you use dispatch_async the block dispatched will not block the current thread, and the execution will continue immediatly.
In your case, when you call scan, you do some stuff and then call dispatch_async to do other stuff. everything in the dispatch block will not be executed in this run loop and [self.storedLibrary scan] returns so scoreWithequation will be executed immediatly.
If you want to block the current thread (the thread on which the dispatch call is executed) you need to use dispatch_sync.
if you want to execute scoreWithequation after scan, you can create a serial_queue, and dispatch_async both scan and then scoreWithequation to the custom serial_queue. Doing so the execution will not block the current thread, and they will be executed in serie.
check "creating serial dispatch queue" ( http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html )
or retaining a completion block to execute scoreWithequation as a callback is also a possibility.