Вы делаете не то и не в том месте.
scrollViewDidScroll вызывается очень часто. При скролинге на 10 px он дернется 10 раз (ну почти, там своя специфика). А Вы еще и заливаете это соусом очередей, а уж если очередь асинхронная - то вообще шляпа , вы получите на те же 10 пикселей 10 операций генерации картинок
Вам нужно либо взять эту большую картинку, обернуть в UIImageView , и вставить в uiscrollview как subview. Картинки высотой до 2к без проблем будут скролится.
Если картинка ну чертовски большая, от 5к и больше - то тут нужно резать, но не так как Вы.
Делаете две UIImageView определенного размера (ну к примеру 1.5x-2x высоты экрана девайса) и вставляете как выше как сабвью, когда пользователь доскраливает до половины этой картинки (это отслеживаете в didScroll) запускаете генерацию следующей порции картинки, вставляете ее в uiimageview и пихаете под первую. Когда пользователь доскролит - картинка догенерируется и для пользователя это будет выглядить безшовно. Если пользователь начинает скролить дальше - выдираете первый imageView , перегенирируете ему изображение и вставляете ниже . Вообщем две плиточки перекладываете по ходу скрола пользователя.