Firestore会干扰动画

时间:2020-08-22 16:33:17

标签: ios swift firebase animation google-cloud-firestore

我的Swift项目遇到一些问题。似乎Firestore函数正在干扰我要在单元格中执行的动画。

我的目标

This animation of a progress bar going from 0.0 to 1.1 inside a UITableViewCell (screenrecord)

实际结果

当前,动画无法播放。进度栏 正在更新,但未设置动画。 It looks like this now.

问题

目标和实际结果在TaskCell.swift中放置了相同的动画代码。与startAnimation()一起单击时,会调用startActionII()

@IBAction func checkBoxAction(_ sender: Any) {
    startActionII()
    startAnimation()
}

func startAnimation() {
    UIView.animate(withDuration: 6.0) {
        self.progressBar.setProgress(1.0, animated: true)
    }
}


func startActionII() {
    if items![indexRow!].checked {
        delegate?.changeButton(state: false, indexSection: indexSection!, indexRow: indexRow!, itemID: itemID)
    } else {
        delegate?.changeButton(state: true, indexSection: indexSection!, indexRow: indexRow!, itemID: itemID)
    }
}

这是问题所在。正确调用了委托方法:所有打印语句和Firestore更新均有效。但是,Firestore代码似乎会干扰动画。当我使用下面显示为changeButton()的代码时,动画不起作用。但是,当我用打印语句替换所有的Firestore代码时,动画确实起作用。这是我的changeButton委托方法。

func changeButton(state: Bool, indexSection: Int?, indexRow: Int?, itemID: String?) {
    
    print("Doing logic II...")
    
    sections[indexSection!].items[indexRow!].checked = state

    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()

    if let itemID = itemID {
        let itemRef = db.collection(K.FStore.lists).document(currentListID!).collection(K.FStore.sections).document("\(indexSection!)").collection(K.FStore.items).document(itemID)



         if sections[indexSection!].items[indexRow!].checked {
            itemRef.updateData([
                 K.Item.isChecked: true,
                 K.Item.checkedBy: currentUserID!,
                 K.Item.dateChecked: Date()
            ]) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                }

            print("hello")


                    DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
                        print("Moving item to itemsChecked...")

                        if let indexSection = indexSection, let indexRow = indexRow {
                                                            let item = self.sections[indexSection].items[indexRow]

                            // Item's properties variables
                            let itemID: String
                            let name: String
                            let uid: String
                            let isChecked: Bool
                            let checkedBy: String
                            let dateCreated: Date
                            let dateChecked: Date

                            let itemRef = self.db.collection(K.FStore.lists).document(self.currentListID!).collection(K.FStore.sections).document("\(indexSection)").collection(K.FStore.items).document(item.itemID!)

                            itemRef.getDocument { (document, error) in
                                if let document = document, document.exists {
                                    let dataDescription = document.data().map(String.init(describing:)) ?? "nil"


                                    // Get the properties of the item
                                    let name = document.data()?[K.Item.name] as? String
                                    let uid = document.data()?[K.Item.uid] as? String
                                    let category = document.data()?[K.Item.categoryNumber] as? Int
                                    let isChecked = document.data()?[K.Item.isChecked] as? Bool
                                    let dateCreated = document.data()?[K.Item.date] as? Date
                                    let dateChecked = document.data()?[K.Item.dateChecked] as? Date
                                    let checkedBy = document.data()?[K.Item.checkedBy] as? String

                                    var ref: DocumentReference? = nil

                                    // Save the properties of the item in sectionsDeleted
                                    ref = self.db.collection(K.lists).document(self.currentListID!).collection(K.FStore.sectionsChecked).document("\(category!)").collection(K.FStore.items).addDocument(data: [
                                            K.Item.name: name,
                                            K.Item.isChecked: isChecked,
                                            K.Item.categoryNumber: category,
                                            K.Item.date: dateCreated,
                                            K.Item.dateChecked: dateChecked,
                                            K.Item.checkedBy: checkedBy,
                                            K.Item.uid: uid,
                                            K.Item.dateDeleted: Date()
                                    ]) { err in
                                        if let err = err {
                                            print("Error adding document: \(err)")
                                        } else {

                                            // If successfull, delete the item in the normal collection
                                            itemRef.delete() { err in
                                                if let err = err {
                                                    print("Error removing document: \(err)")
                                                } else {
                                                    print("Document successfully removed!")
                                                }
                                            }
                                        }
                                    }
                                } else {
                                    print("Document does not exist")
                                }
                            }

                            self.tableView.reloadData()

        } else {
            itemRef.updateData([
                K.Item.isChecked : false
            ]) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                }
                            }
    }
                } } } }

    refreshTable()
}

有人可以帮助我解决此问题吗?

非常感谢, 马特

GitHub linkLink to branch 'MoveSections'

1 个答案:

答案 0 :(得分:0)

我在您的项目中发现了一些问题

  1. google info plist的路径错误,您创建了对is的引用,但应将其复制到项目路径中。

enter image description here

我无法构建该项目,因为我缺少我提到的google info plist

*编辑

看看你在这里做什么

您调用“ startActionII()”并更改模型布尔状态,这很好,然后在该异步块内,在表视图上调用重新加载数据。

您有冲突的UI行为,一方面试图显示带有动画的进度条,然后在同一时间(几乎是异步的)重新加载整个表格视图并覆盖动画。

您的操作存在问题,因为您的用户界面是交互式的,这意味着用户单击会立即而不是在过程结束时影响数据库,那么进度动画的目的是什么?