Firebaseの値で簡単な計算システムを作成しました。しかし、私がそれを評価すると、計算と値は大丈夫ですが、ラベルは更新されません。Firebaseの値がラベル上で更新されていません
私は値を取得して計算を行う方法です。
let ref = FIRDatabase.database().reference().child("Snuses").queryOrdered(byChild: "Brand")
.queryEqual(toValue: brandName)
ref.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists(){
let enumerator = snapshot.children
while let thisProduct = enumerator.nextObject() as? FIRDataSnapshot {
// Chances are you'd have to create a dictionary
let thisProductDict = thisProduct.value as! [String:AnyObject]
let rating = thisProductDict["rating"] as! Double
let ratersCount = thisProductDict["ratersCount"] as! Double
let ratingToShow: String = String((ratersCount == 0) ? 0 : rating/ratersCount)
let productObject = Product(
rating: rating,
ratersCount: ratersCount,
ratingToShow: ratingToShow)
self.products.append(productObject)
}
self.tableView.reloadData()
そしてcellForRowAtIndexPath
に、私はラベルにratingToShowを表示してみた:
cell.ratingLabel.text = products[indexPath.row].ratingToShow
そして、私は値を追加する方法は、この次のとおりです。
let ratingToShow: String = String((products[indexPath.row].ratersCount == 0) ? 0 : products[indexPath.row].rating/products[indexPath.row].ratersCount)
cell.likeLabel.text = ratingToShow
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).child(self.currentUser.generalDetails.uid).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.value as? Bool == true{
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).child("rating").observeSingleEvent(of: .value, with: { (snapshot) in
let currentUserRate = snapshot.value
cell.ratingView.rating = currentUserRate as! Double
})
}else{
cell.ratingView.rating = 0.0
}
cell.ratingView.didFinishTouchingCosmos = { rating in
if snapshot.value as? Bool == true{
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).child("rating").observeSingleEvent(of: .value, with: { (snapshot) in
let currentUserRate = snapshot.value as? Double
self.databaseRef.child("Snuses").child(self.products[indexPath.row].snusProductTitle).child("rating").runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Double
if (value == nil) {
value = 0.0
}
currentData.value = value! - currentUserRate!
cell.update(rating)
return FIRTransactionResult.success(withValue: currentData)
})
self.databaseRef.child("Snuses").child(self.products[indexPath.row].snusProductTitle).child("rating").runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Double
if (value == nil) {
value = 0.0
}
currentData.value = value! + rating
cell.update(rating)
return FIRTransactionResult.success(withValue: currentData)
})
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Bool
if (value == nil) {
value = true
}
currentData.value = [self.currentUser.generalDetails.uid:true]
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).updateChildValues(["rating": rating])
return FIRTransactionResult.success(withValue: currentData)
})
})
}else{
self.databaseRef.child("Snuses").child(self.products[indexPath.row].snusProductTitle).child("ratersCount").runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Double
if (value == nil) {
value = 0.0
}
currentData.value = value! + 1
return FIRTransactionResult.success(withValue: currentData)
})
self.databaseRef.child("Snuses").child(self.products[indexPath.row].snusProductTitle).child("rating").runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Double
if (value == nil) {
value = 0.0
}
currentData.value = value! + rating
cell.update(rating)
return FIRTransactionResult.success(withValue: currentData)
})
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).runTransactionBlock({
(currentData:FIRMutableData!) in
var value = currentData.value as? Bool
if (value == nil) {
value = true
}
currentData.value = [self.currentUser.generalDetails.uid:true]
self.databaseRef.child("productRatings").child(self.currentUser.generalDetails.uid).child(self.products[indexPath.row].snusProductTitle).updateChildValues(["rating": rating])
return FIRTransactionResult.success(withValue: currentData)
})
}
}
})
どうすればよいですか?
実行されますので、
runTransactionBlock
年代がローカルキャッシュにロードされますがあります問題がセルテキストを埋めるコードのほうにあるように見えるため、問題を理解するための十分な情報が不足しています。しかし、製品オブジェクトを使って作業しているのであれば、cell.likeLabel.text = productObject.ratingToShowのようになります。 – Jay私はProduct structureも持っています。 –
まあ、あなたの質問のコードは概念的には大丈夫ですが、明らかにproductName、snusNicotineなどが見つからないので、ProductObjectを実装してコードがそのまま動作することはありません。私はセルに値を設定するコードを見てみる必要があると思います。また、製品の配列内のproductObjectsが改ざんされたり省略されたりしないように、ここに印字ステートメントをスローすることもできます。 – Jay