         
         // MARK: - Updating
         
-        private func updateImage() {
-            self.displayedImage = self.imageSource?.cgImage(at: self.displayedIndex)
-            
+        private let queue = DispatchQueue(label: "ImageSourceView")
+        
+        private func updateImage(asynchronously: Bool = true) {
+            if asynchronously {
+                queue.async {
+                    var options = ImageSource.ImageOptions()
+                    options.shouldDecodeImmediately = true
+                    let image = self.imageSource?.cgImage(at: self.displayedIndex, options: options)
+                    
+                    DispatchQueue.main.async {
+                        self.displayedImage = image
+                    }
+                }
+            } else {
+                queue.sync {
+                    self.displayedImage = self.imageSource?.cgImage(at: self.displayedIndex)
+                }
+            }
+        }
+        
+        private func updateProperties() {
             self.invalidateIntrinsicContentSize()
-            
-            self.displayView.transform = self.imageSource?.properties(at: self.displayedIndex).transform ?? CGAffineTransform.identity
+            self.displayView.transform = self.imageSource?.properties().transform ?? CGAffineTransform.identity
         }
         
         // MARK: - URL Loading

                animationController = nil
                displayedIndex = 0
                updateAnimation()
                updateImage()
                
                if let imageSource = _imageSource {
                    notificationObservers.append(notificationCenter.addObserver(forName: ImageSource.didUpdateData, object: imageSource, queue: nil, using: { [weak self] _ in
                        if Thread.isMainThread {
                            self?.updateImage()
                            self?.updateAnimation()
                        } else {
                            DispatchQueue.main.async { // must be async
                                self?.updateImage()
                                self?.updateAnimation()
                            }
                        }
                    }))
                }
            }

        }
        
        open override var intrinsicContentSize: CGSize {
            return imageSource?.properties().imageSize ??
                CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric)
        }
        
