Ok. This is the exact same question as here: Why is NSFetchedResultsController loading all rows when setting a fetch batch size?
But the solution for his doesn\'t solve
I've had the same question and in the end I concluded, that it works as it should.
When you set fetchBatchSize fetchRequest loads all data to cache because otherwise this parameter would be useless. I guess it's used for using data just after loading. But when you getting object as [fetchResultController objectAtIndexPath:indexPath]
it is fulfilled by ManagedObjectContext (I suppose), not by fetchRequest.
So you can set fetchBatchSize to 0 and every time you access fault it will be requested from persistent store. Or you can set other value and also set fetchLimit and fetchOffset every time you scroll table view. But you still have to know overall objects number.