#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. Я совсем новичок, и мне еще так многому нужно научиться. Большое вам спасибо за информацию, которую я буду копать и читать об этом!