                 let end = CFAbsoluteTimeGetCurrent()
                 // The amount of time spent on the main thread may be high, but the user impact is small because
                 // we are dispatching small blocks and not doing any work if the user is interacting.
-                self?.logger("user: \((end-start).ms) (main: \((timeOnMainThread + end - startMain).ms))")
+                self?.logger?("user: \((end-start).ms) (main: \((timeOnMainThread + end - startMain).ms))")
                 completion?()
             })
         }

        }
        reloadableView?.reloadDataSync()
        let end = CFAbsoluteTimeGetCurrent()
        logger("user: \((end-start).ms)")
        completion?()
    }


    weak var reloadableView: ReloadableView?

    /// Logs messages.
    public var logger: (String -> Void)? = nil

    public init(reloadableView: ReloadableView) {
        self.reloadableView = reloadableView
