使用带有闭包的TableViewCell委托函数时使用[弱自我]的安全方法?

时间:2018-07-19 14:40:54

标签: ios swift uitableview

我正在尝试将tableviewcell委托函数与完成关闭块一起使用。

我担心在这种情况下何时应该使用[弱者]。

我也想知道实现这种逻辑的更好方法

该代码要做什么?

当用户点击将新项目添加到堆栈视图中

它将从远程服务器获取数据。

如果获取,则让tableviewcell添加新项目

protocol myTableViewCellSubViewDelegate {

    func fetchData(cell: MyTableViewCell, completion: @escaping (Bool) -> ())
}


class MyTableViewCell: UITableViewCell {

    var delegate: myTableViewCellSubViewDelegate?

    var stackView = UIStackView()


    func startFetchData(){

        delegate?.fetchData(cell: self){ success in

            if success {
                self.stackView.addArrangedSubview(UIView())

            }
        }
    }
}

查看MyTableViewCell中的startFecthData函数。

  1. 我是否应该使用[弱自我]?

  2. 在fetchData函数中,是否应该@转义?

  3. 如何使用延期?

这是MyViewController.swift

 class MyViewController: UIViewController, myTableViewCellSubViewDelegate {

 func doSomthing(url : URL, completion: (Error?) -> ()) {

        completion(nil)

    }

 func fetchData(cell: MyTableViewCell, completion: @escaping (Bool) -> ()) {

        doSomthing(url: URL(string: "www.stackoverflow.com")!) { error in

            if error != nil {
                print("Error...")
            }else {

                completion(true)
            }

        }
    }
}

1 个答案:

答案 0 :(得分:1)

  1. 您应该使用[weak self]。这样可以避免在重新分配此单元格后发生崩溃。

    func startFetchData(){
    
        delegate?.fetchData(cell: self){ [weak self] success in
            if success {
                self?.stackView.addArrangedSubview(UIView())
            }
        }
    
    }
    
  2. 使用@转义,因为您在另一个闭包中运行此闭包。

  3. 不要。