快速关闭中gcd的自我弱化

时间:2015-02-28 10:37:22

标签: swift closures grand-central-dispatch weak-references

    apiFunc(user: User.currentUser, start: 0, limit: Constants.numberOfItemInOnePage,
        success: { [weak self] (friends) -> Void in
            dispatch_async(dispatch_get_main_queue(), { [weak self] () -> Void in
                if let strongSelf = self {
                    strongSelf.friendList = friends
                    strongSelf.loading = false
                    strongSelf.tableView.reloadData()
                }
            })
        }, failure: nil)

错误

Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

在编译上面的代码时发生,但是如果我删除第二个[弱自我],则错误消失

    apiFunc(user: User.currentUser, start: 0, limit: Constants.numberOfItemInOnePage,
        success: { [weak self] (friends) -> Void in
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                if let strongSelf = self {
                    strongSelf.friendList = friends
                    strongSelf.loading = false
                    strongSelf.tableView.reloadData()
                }
            })
        }, failure: nil)

我认为因为有两个闭包,它应该是2 [弱自我],任何人都知道为什么编译错误发生

1 个答案:

答案 0 :(得分:1)

您不必在嵌套闭包中重复[weak self],就像在Objective-C中使用@weakify__weak self模式一样。

Swift中的

[weak self]由编译器自动创建相同的模式,而外部闭包定义的弱self由内部闭包使用。

以下是Objective-C版本的相应问题: iOS blocks and strong/weak references to self