Tim's post is the general idea behind what you need to do, but it deadlocks the main thread, which can cause havoc with some APIs.
A better way to do it is to wait but keep the main thread running. There is a great example here:
IOS -NSRunLoop in XCTest: How Do I Get A Run Loop to Work in A Unit Test?
Have some sort of condition that's set when you've handled your async's completion and set up your loop that spins the run loop to end and move on when this condition is met.
Note that you might want to have a maximum time that you wait on the async test. If your async test never completes (maybe there is an error in the underlying code), you'll deadlock on the test, and that would be bad. So note the starting time of the test, and if you've been waiting longer than a certain length of time past the start time, fail the test and move on.