         }
         if let articleKey = articleKey {
             cacheKeysByArticleKey[articleKey, default: []].insert(cacheKey)
+            if let groupKey = groupKey {
+                groupKeysByArticleKey[articleKey, default: []].insert(groupKey)
+            }
         }
         cachedHeights[cacheKey, default: [:]][columnWidth.roundedColumnWidth] = height
     }

    private var cachedHeights: [String: [Int: CGFloat]] = [:]
    private var cacheKeysByGroupKey: [String: Set<String>] = [:]
    private var cacheKeysByArticleKey: [String: Set<String>] = [:]

    private func cacheKeyForCellWithIdentifier(_ identifier: String, userInfo: String) -> String {
        return "\(identifier)-\(userInfo)"
    }

    }
    
    public func invalidateArticleKey(_ articleKey: String?) {
        guard let articleKey = articleKey else {
            return
        }
        if let cacheKeys = cacheKeysByArticleKey[articleKey] {
            for cacheKey in cacheKeys {
                cachedHeights.removeValue(forKey: cacheKey)
            }
            cacheKeysByArticleKey.removeValue(forKey: articleKey)
        }
        if let groupKeys = groupKeysByArticleKey[articleKey] {
            for groupKey in groupKeys {
                invalidateGroupKey(groupKey)
            }
        }
    }
    
    public func invalidateGroupKey(_ groupKey: String?) {
