 <p>The problem is in the predicate. It fetches all products without an image. If I download images, the result set for the predicate changes on a subsequent fetch and gets smaller every time. The solution is to process the result set in reverse order. So change:</p> <pre><code>for (NSUInteger offset = 0; offset &lt; numberOfProducts; offset += batchSize) </code></pre> <p>Into:</p> <pre><code>for (NSInteger offset = MAX(numberOfProducts - batchSize, 0); offset &gt; 0; offset -= batchSize) </code></pre>