Каждый раз, когда разные пользователи публикуют что-то (скажем, цвет), я получаю цвет, который они опубликовали, postID, их userId, дату в секундах и сколько раз это сообщение было просмотрено.
Другой пользователь может просматривать таблицу и просматривать разные ячейки с каждым цветом, опубликованным каждым пользователем.
Каждый раз, когда пользователь, который ищет, нажимает didSelectRow
, чтобы просмотреть подробный вид цвета, я запускаю Firebase TransactionBlock
, который увеличивает свойство подсчета views
, чтобы показать, сколько раз этот конкретный цвет / ячейка был нажат.
Например, если пользователь просматривает tableView и видит blueCell, на нем будет метка, которая говорит просмотров: 10 (что означает, что его просматривали 10 раз). Если этот пользователь снова нажмет эту blueCell, то число просмотров будет показано просмотров: 11 .
Проблема в том, что если этот пользователь нажимает эту ячейку несколько раз, он может увеличить count
на этой метке views
в считанные секунды.
Как я могу отслеживать каждый объект / ячейку, к которому пользователь прикоснулся, и поставить на него таймер, чтобы он не мог обновить views count
для этого конкретного объекта, возможно, еще час или около того? У меня есть дата в секундах и postId, которые являются уникальными для каждого объекта.
Обычно, если пользователь нажимает на blueCell в 12 часов вечера, количество просмотров объекта, связанного с этой конкретной ячейкой, возрастет до 11, но если они нажмут его снова в любое время в промежутке между 12 и 13 часами вечера, он не увеличится. После 13:00, если они нажимают это снова, количество просмотров для этого объекта увеличится до 12?
Объект модели и свойства, которые я могу использовать для идентификации каждого цветового объекта:
class ColorClass{
var color: String?
var postID: String?
var userId: String?
var date: NSNumber?
var views: NSNumber? // keeps track of how many the post was viewed
}
TableView's didSelectRow:
// the current user who is pressing the cell
let currentUserID = Auth.auth().currentUser?.uid
var colors = [ColorClass]() // 500 model objects
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return colors.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ColorsCell", for: indexPath) as! ColorsCell
cell.viewsLabel.text = colors[indexPath.row].views // I separately convert this from a NSNumber to a String
cell.colorLabel.text = colors[indexPath.row].color
return cell
}
// pressing the cell will increase the count on the object's views property
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let indexPath = tableView.indexPathForSelectedRow else { return }
// the userId on the object of the cell that was pressed
guard let userID = colors[indexPath.row].userId else { return }
guard let postID = colors[indexPath.row].postId else { return }
// make sure the current user can't update the views on their own post
if currentUserID != userID{
let viewsRef = databaseRef?.child(userID).child(postID).child("views")
viewsRef?.runTransactionBlock({
(currentData: MutableData) -> TransactionResult in
let newValue: Int
guard let existingValue = (currentData.value as? NSNumber)?.intValue else {
return TransactionResult.abort()
}
newValue = existingValue + 1
currentData.value = NSNumber(value: newValue)
return TransactionResult.success(withValue: currentData)
}, andCompletionBlock: {
(error, completion, snap) in
print(snap as Any)
if !completion{
print("The value wasn't able to update")
print(error?.localizedDescription as Any)
}else{
print("The value updated")
}
})
}
}
Просто идея.
Я думал о создании другого объекта, который имел бы свойства currentUserID, postID и tappedTime. Тогда я бы создал синглтон. Каждый раз, когда нажимается ячейка, я передаю данные в объект, а затем отправляю объект в массив в синглтоне. Там у меня будет свойство currentTime. Сначала я проверю, есть ли postID в массиве, и если да, то сравнил бы tappedTime с currentTime + 1 час, чтобы решить, следует ли увеличить количество просмотров. У меня был бы таймер асинхронной отправки, и через 1 час он автоматически удалялся из массива. Я не уверен, насколько это практично.