This is actually not true if opQueue is not + [NSOperationQueue mainQueue]
This completion block will be scheduled in the queue that you provide. In your case, you call this queue "opQueue". If this queue is dropped by some thread other than the main thread, then you should not make this call to reload the table.
Instead, you should do any processing and then insert another block into the main queue, which causes a reboot.
^(NSURLResponse *response, NSData *data, NSError*error){
Or, if processing is easy and fast (and a fixed amount of time), then simply pass mainQueue as "opQueue";
Hope this makes sense. A lot of useful information can be found here: Concurrency Programming Guide
source share