         self.viewCreationBlock = viewCreationBlock
     }
     
-    public func renderImageWithData(_ data: Data) -> UIImage {
-        let view = self.viewCreationBlock(data)
-        view.frame.origin = .zero
-        view.bounds.size = data.size
-        view.layoutIfNeeded()
-        
-        let renderer = UIGraphicsImageRenderer(
-            size: data.size,
-            format: self.format
+    public func renderImageWithData(_ data: Data) -> SignalProducer<UIImage, NoError> {
+        return createProducer(
+            data,
+            viewCreationBlock: self.viewCreationBlock,
+            renderBlock: { view in
+                let renderer = UIGraphicsImageRenderer(
+                    size: data.size,
+                    format: self.format
+                )
+                
+                return renderer.image { context in
+                    draw(view: view, inContext: context.cgContext)
+                }
+            }
         )
-        
-        return renderer.image { context in
-            precondition(
-                view.drawHierarchy(in: view.bounds, afterScreenUpdates: true),
-                "Error generating snapshot"
-            )
-        }
     }
 }
 
-/// `SynchronousRendererType` which generates a `UIImage` from a UIView.
-public final class OldViewRenderer<Data: RenderDataType>: SynchronousRendererType {
+/// `RendererType` which generates a `UIImage` from a UIView.
+public final class OldViewRenderer<Data: RenderDataType>: RendererType {
     public typealias Block = (_ data: Data) -> UIView
     
     private let opaque: Bool

        self.viewCreationBlock = viewCreationBlock
    }
    
    public func renderImageWithData(_ data: Data) -> UIImage {
        let view = self.viewCreationBlock(data)
        view.frame.origin = .zero
        view.bounds.size = data.size
        view.layoutIfNeeded()
        
        UIGraphicsBeginImageContextWithOptions(data.size, self.opaque, 0)
        defer { UIGraphicsEndImageContext() }
        
        precondition(
            view.drawHierarchy(in: view.bounds, afterScreenUpdates: true),
            "Error generating snapshot"
        )
        
        return UIGraphicsGetImageFromCurrentImageContext()!
    }
}

import UIKit
import CoreGraphics

import ReactiveSwift
import Result

/// `RendererType` which generates a `UIImage` from a UIView.
@available(iOS 10.0, tvOSApplicationExtension 10.0,  *)
public final class ViewRenderer<Data: RenderDataType>: RendererType {
    public typealias Block = (_ data: Data) -> UIView
    
    private let format: UIGraphicsImageRendererFormat
