如何过滤领域结果<Object>

时间:2021-07-01 16:41:12

标签: ios swift realm

我使用 mongoDB 来存储数据。我有一个 Result 数组,该数组包含多个相同的关键字结果。

class Keywords: Object {
@objc dynamic var name: String = ""
@objc dynamic var date: Date = Date()
@objc dynamic var rank: Int = 0
@objc dynamic var requestedURL: String = ""
}

用户不能对同一个关键字名称多次发送请求。

     let action = UIAlertAction(title: "Add", style: .default) { action in
        if let textSafe = text.text {
            let textPrefix = textSafe.removeWhitespace()
            
            if self.keywordModel.keywordNames.count > 0 {
                if self.keywordModel.keywordNames.contains(textSafe) {
                    return
                } else {
                    self.seo.fetchSEO(keyword: textPrefix, requestURL: self.selectedDomain!.domainName, start: 1)
                }
            } else {
                self.seo.fetchSEO(keyword: textPrefix, requestURL: self.selectedDomain!.domainName, start: 1)
            }
        }
    }

我的代码在这部分工作正常。

但是当用户想要刷新以更新结果时,我需要编写过滤结果,或者如果关键字多次存储在数据库中,则必须以某种方式只获取最近的结果。顺便说一句,我需要成倍的关键字数据结果,因为我想在将来将它们用于日期进度图表。

所以我只需要保存所有结果,但我只想在 UI 上显示最近的结果。

@objc func refresh(_ sender: AnyObject) {
    var keywordArray = [String]()
    
    keywordModel.keywordNames.forEach { keyword in
        keywordArray.append(keyword)
    }
    
    keywordModel.keywordNames = [String]()
    keywordModel.keywordRanks = [Double]()
    
    keywordArray.forEach { keyword in
        self.seo.fetchSEO(keyword: keyword, requestURL: self.selectedDomain!.domainName)
    }
    
    
    print(keyword!)
    let deadLine = DispatchTime.now() + .seconds(3)
    DispatchQueue.main.asyncAfter(deadline: deadLine) {
        self.refreshControl?.endRefreshing()
    } 
}

为了更详细,我将结果传输到 KeywordModel 进行一些计算,并通过下面的 KeywordModel 代码管理所有 tableview。

struct KeywordModel {
var keywordRanks = [Double]()
var averageRank: Double? = 0.0
var keywordCount: Int? = 0
var keywordNames = [String]()

var keywordCountString: String? {
    return String(keywordCount!)
}
var averageRankString: String? {
    return String(format: "%.01f", averageRank!)
}

mutating func averageOfRanks(resultKeyword: Results<Keywords>?) {
    keywordCount = resultKeyword?.count
    var n = 0
    var raw = [Double]()
        
    while n < resultKeyword!.count {
        raw.append(Double(resultKeyword![n].rank))
        n += 1
    }
    keywordRanks = raw
    
    let rankSum = keywordRanks.reduce(0, +)
    averageRank = rankSum / Double(keywordRanks.count)
}

mutating func saveKeywords(from results: Results<Keywords>?) {
    if results!.count > 0 {
        var n = 0
        var raw = [String]()
        while n < results!.count {
            raw.append(results![n].name)
            n += 1
        }
        keywordNames = raw
    }
}

还有我的 loadData 方法,我可以在其中应用过滤器。

 func loadData() {
    keyword = selectedDomain?.keywords.sorted(byKeyPath: "name")
    
    statisticCalculate(keyword: keyword)
    tableView.reloadData()
}

0 个答案:

没有答案