         return tableView
     }()
     
-    var cellNodes: [RootNode] = [] {
-        didSet {
-            tableView.reloadData()
-        }
-    }
+    fileprivate var nodeModels: [(TweetModel, RootNode)] = []
+    private var referenceWidth: CGFloat = 0
     
     override func viewDidLoad() {
         super.viewDidLoad()

    }
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        (cell as? TweetCell)?.rootNode = cellNodes[indexPath.row]
    }
    
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        return cellNodes[indexPath.row].frame.height
    }
}

class MyView: UIView {
    
    var color: UIColor? {
        set {
            backgroundColor = newValue
        }
        get {
            return backgroundColor
        }
    }
}

class TweetCell: UITableViewCell {
    
    override func layoutSubviews() {
        super.layoutSubviews()
        rootNode?.installInRootView(contentView)

        title = "Table Demo"
        view.addSubview(tableView)
        
        nodeModels = TweetModel.stubData().map { ($0, RootNode(size: CGSize.zero, subnodes: []))}
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.lx.fill()
        
        let width = tableView.frame.width
        
        if width != referenceWidth {
            referenceWidth = width
            
            let models = nodeModels.map { $0.0 }
            DispatchQueue.global(qos: .background).async {
                let nodeModels = models.map { ($0, TweetCell.buildRootNode($0, width: width))}
                DispatchQueue.main.async {[weak self] in
                    self?.didLoad(nodeModels: nodeModels, width: width)
                }
            }
        }
    }
    
    private func didLoad(nodeModels: [(TweetModel, RootNode)], width: CGFloat) {
        print("did cache")
        if width == referenceWidth {
            self.nodeModels = nodeModels
            tableView.reloadData()
        }
    }
}

extension TableViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return nodeModels.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
