加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 发布到Firebase时,Cell重复多次

发布时间:2020-12-14 04:56:07 所属栏目:百科 来源:网络整理
导读:我正在制作一个可以发布消息的应用程序.我将数据存储在Firebase中.当我发布新消息时,该特定单元格多次复制(所以我看到帖子有2,3,4次或更多次).但它只是Firebase中的一个帖子.当我刷新屏幕时(例如对数据进行排序),它只是一个帖子.我究竟做错了什么? 这是我的
我正在制作一个可以发布消息的应用程序.我将数据存储在Firebase中.当我发布新消息时,该特定单元格多次复制(所以我看到帖子有2,3,4次或更多次).但它只是Firebase中的一个帖子.当我刷新屏幕时(例如对数据进行排序),它只是一个帖子.我究竟做错了什么?

这是我的相关代码:

override func viewDidLoad() {
    super.viewDidLoad()

    DataService.ds.REF_POSTS.observeEventType(.Value,withBlock:  { snapshot in
        let sortByDate = NSUserDefaults.standardUserDefaults().boolForKey("sortByDate")
        if sortByDate == true {
            self.sortingByDate()
            self.tableView.reloadData()
        } else {
            self.sortingByLikes()
            self.tableView.reloadData()
        }
    })
}

按日期排序数据:

func sortingByDate() {
    NSUserDefaults.standardUserDefaults().setBool(true,forKey: "sortByDate")
    sortDateBtn.setTitleColor(UIColor(red: 255/255,green: 102/255,blue: 102/355,alpha: 1.0),forState: .Normal)
    sortLikeBtn.setTitleColor(UIColor(red: 76/255,green: 76/255,blue: 76/355,forState: .Normal)

    if (searchController.active) {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded,withBlock: { snapshot in
            if let postDict = snapshot.value as? Dictionary<String,AnyObject> {
                let key = snapshot.key
                let post = Post(postKey: key,dictionary: postDict)
                self.posts.insert(post,atIndex: 0)
            }
            if let searchText = self.searchController.searchBar.text {
                self.filterContent(searchText)
                self.tableView.reloadData()
            }
        })
    } else {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded,atIndex: 0)
            }
            self.tableView.reloadData()
        })
    }
}

按喜欢排序数据:

func sortingByLikes() {
    NSUserDefaults.standardUserDefaults().setBool(false,forKey: "sortByDate")
    sortLikeBtn.setTitleColor(UIColor(red: 255/255,forState: .Normal)
    sortDateBtn.setTitleColor(UIColor(red: 76/255,forState: .Normal)

    if (searchController.active) {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded,atIndex: 0)
            }
            if let searchText = self.searchController.searchBar.text {
                self.filterContent(searchText)
                self.tableView.reloadData()
            }
        })
    } else {
        self.posts = []
        DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded,atIndex: 0)
            }
            self.tableView.reloadData()
        })
    }
}

发布到Firebase:

func postToFirebase(imgUrl: String?) {
    let imageForProfile = NSUserDefaults.standardUserDefaults().valueForKey("profileImage")
    var post: Dictionary<String,AnyObject> = [
        "title": titleTextField.text!,"description": descriptionTextField.text!,"likes": 0,"location": locationTextField.text!,"username": usernameDisplay.text!,"uid": NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID)!,"img": String(imageForProfile!),"timestamp": NSDate.timeIntervalSinceReferenceDate(),"lat": lat,"long": long,]

        if imgUrl != nil {
            post["imageUrl"] = imgUrl
        }

let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
let url = NSURL(fileURLWithPath: "(firebasePost)")
let lastComponent = url.lastPathComponent

    if lastComponent != nil {
        post["postKey"] = lastComponent!
    }

firebasePost.setValue(post)

titleTextField.text = ""
descriptionTextField.text = ""
locationTextField.text = ""
imageField.image = UIImage(named: "camera")
imageSelected = false

NSUserDefaults.standardUserDefaults().setBool(true,forKey: "sortByDate")
}

泰伯维:

func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {
        let postList = searchController.active ? searchResult[indexPath.row] : posts[indexPath.row]
        let post = postList
        cell.request?.cancel()

        var image: UIImage?
        if let url = post.postImgUrl {
            image = FeedVC.imageCache.objectForKey(url) as? UIImage
        }

        var image2: UIImage?
        if let url2 = post.userImgUrl {
            image2 = FeedVC.imageCache.objectForKey(url2) as? UIImage
        }

        cell.configureCell(post,img: image,img2: image2)

        return cell
    } else {
        return PostCell()
    }
}

我的cell.configurecell实现:

func configureCell(post: Post,img: UIImage?,img2: UIImage?) {
    self.post = post
    likeRef = DataService.ds.REF_USER_CURRENT.childByAppendingPath("likes").childByAppendingPath(post.postKey)

    self.descriptionText.text = post.postDescription
    self.descriptionText.scrollRangeToVisible(NSMakeRange(0,0))
    self.likes = post.likes
    self.likesLbl.text = "(post.likes) likes"
    self.postTitle.text = post.postTitle
    self.postLocation.text = post.postLocation
    self.username.text = post.username
    self.postKeyLbl.text = post.key
    self.lat = post.lat
    self.long = post.long

    if post.postImgUrl != nil {
        if img != nil {
            self.showcaseImg.image = img
        } else {
            request = Alamofire.request(.GET,post.postImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request,response,data,err in
                if err == nil {
                    let _img = UIImage(data: data!)!
                    self.showcaseImg.image = img
                    FeedVC.imageCache.setObject(_img,forKey: self.post.postImgUrl!)
                } else {
                    print(err.debugDescription)
                }
            })
        }
    } else {
        self.showcaseImg.hidden = true
    }

    if post.userImgUrl != nil {
        if img2 != nil {
            self.profileImg.image = img2
        } else {
            request = Alamofire.request(.GET,post.userImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request,err in
                if err == nil {
                    let _img2 = UIImage(data: data!)!
                    self.profileImg.image = img2
                    FeedVC.imageCache.setObject(_img2,forKey: self.post.userImgUrl!)
                } else {
                    print(err.debugDescription)
                }
            })
        }
    } else {
        print("no image")
    }

    likeRef.observeSingleEventOfType(.Value,withBlock: { snapshot in
        if snapshot.value is NSNull {
            self.likesImg.image = UIImage(named: "heart")
        } else {
            self.likesImg.image = UIImage(named: "heart-filled")
        }
    })

    let getUid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID)
    if String(getUid!) == (self.post.postUid) {
        editBtn.hidden = false
        delBtn.hidden = false

        let usernameDefaults = NSUserDefaults.standardUserDefaults().valueForKey("username")
        if usernameDefaults != nil {
            username.text = String(usernameDefaults!)
        }

        let checkIfImageChanged = NSUserDefaults.standardUserDefaults().boolForKey("imgIsChanged")
        if checkIfImageChanged == true {
            self.changePost()
            NSUserDefaults.standardUserDefaults().setBool(false,forKey: "imgIsChanged")
        }
    } else {
        editBtn.hidden = true
        delBtn.hidden = true
    }

    mapVC.markerTitle = postTitle.text
    mapVC.markerSnippet = postLocation.text
    mapVC.markerLat = lat
    mapVC.markerLong = long
}

谢谢你的帮助!

解决方法

由于您使用委托方法tableView.dequeueReusableCellWithIdentifier,因此在请求新单元格时,如果不使用新数据更新新单元格,则会带来包含旧数据的单元格.为了确保我需要查看你的cell.configureCell实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读