Как отфильтровать результаты области

#ios #swift #realm

Вопрос:

Я использую MongoDB для хранения данных. У меня есть массив результатов, который содержит несколько одинаковых результатов по ключевым словам.

 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)
            }
        }
    }
 

Мои коды работают нормально до этой части.

Но когда пользователи хотят обновить, чтобы обновить результаты, мне нужно записать результаты фильтрации или каким-то образом получить только последние последние результаты, если ключевые слова несколько раз хранятся в базе данных. Кстати, мне нужны результаты умножения данных по ключевым словам, так как я хочу использовать их для графиков прогресса дат в будущем.

Поэтому мне просто нужно сохранить все результаты, но я хочу показывать только более свежие результаты в пользовательском интерфейсе.

 @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 ниже.

 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()
}
 

Комментарии:

1. Вопрос немного неясен, и похоже, что вы задаете несколько вопросов — один об обеспечении уникальных значений, второй о сохранении результатов и третий о показе только последних результатов. Моя другая проблема заключается в названии вопроса Realm result Array , потому что объект результатов области не является массивом и ведет себя совсем иначе, чем массив. Хотя у них похожий интерфейс, они очень разные. Можете ли вы уточнить, используете ли вы результаты или массив?

2. Извините за неясность, Realm Result Array означает Results<Keyword> массив. На самом деле проблема решена путем добавления другой Statistics таблицы в базу данных. Поэтому в Keyword таблице я сохраняю только rank и keyword name . И если requested keyword уже содержится в таблице, обновите их только новым недавним rank значением, а тем временем добавьте новое значение в Statistics таблицу, если предыдущее значение старше одного дня. Но мне все еще любопытно, могу ли я отправить запрос на выборку с помощью массива [String] ключевых слов без цикла. Потому что в PHP языке есть способ.

3. Это важно: Results<Keyword> array это НЕ массив, это объект результатов. Возможно, вы упускаете из виду фундаментальную функцию области; Объекты результатов области являются ЖИВЫМИ — по мере добавления, изменения или удаления объектов из области объекты результатов всегда отражают эти изменения. Так, например, если у вас есть объект результатов, содержащий ключевые слова. Если вы хотите убедиться, что ключевые слова, вводимые пользователем, уникальны, вам не нужно постоянно запрашивать ключевые слова; при добавлении в Область они автоматически появятся в объекте результатов, поэтому вы можете просто посмотреть, существуют ли они там перед добавлением в область.

4. Я совсем новичок, и мне еще так многому нужно научиться. Большое вам спасибо за информацию, которую я буду копать и читать об этом!