You should not access your NSManagedObjectContext on multiple threads. The NSManagedObjectContext created in your AppDelegate should only be accessed on main thread.
It implies, you should create a NSManagedObjectContext for each thread you create. Make sure to set the thread's NSManagedObjectContext's parent context as your main context.
Example : -
NSManagedObjectContext *mainContext; // = getMainContext
NSManagedObjectContext *threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
threadContext.parentContext = mainContext;
and then use threadContext on your thread...
You can continue your UI related fetching on main thread. Or if it is essential to have other thread for it too, create a context for it too.
To know the Core Data concurrency in depth see a tutorial
Setting Parent/Child context relationship will merge your thread's Context with main context (it's parent context).
To understand Parent/Child context relationship check this URL
Or just under this diagram -

Credits to the article URL...