I was having the exact same problem. It all started as soon as I added MetalKit as a framework.
Anyway in case anyone else is having the same problem, you need to request the Image synchronously even if all your calls are being scheduled on the main-thread I only set this as sync on the DEBUG builds as release builds seems to work fine.
PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
requestOptions.synchronous = YES;
....
[manager requestImageForAsset:asset
targetSize:targetSize
contentMode:contentMode
options:requestOptions...];