Swift - 可变丢失数据

时间:2016-12-13 21:49:21

标签: swift firebase swift2.3

Xcode 8.1,Swift 2.3,iOS 10.1,我使用Firebase

我不是在关闭之外访问数据。我想获得downloadURL1和downloadURL2,例如self.url1 = downloadURL1

但是downloadURL1在关闭之外是零。

storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in
            if let error = error1 {
                print(error.localizedDescription)
                return
            } else {
                let downloadURL1 = metadata1!.downloadURL()!.absoluteString                
            }
        }

        storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in
            if let error = error2 {
                print(error.localizedDescription)
                return
            } else {
                let downloadURL2 = metadata2!.downloadURL()!.absoluteString
            }
        }

2 个答案:

答案 0 :(得分:1)

如果我说得对,你说你不能下载URL1并在你的闭包之外下载URL2的值吗?

好吧,如果是这样的话,这是完全正常的。您之前应该在闭包之外声明变量。但是尝试在闭包之外使用这两个变量的值是行不通的,因为它是异步的。

所以你可能也想使用他们的didSet属性。但是在这种情况下,为什么要使用downloadURL1和downloadURL2,而不是直接做那样的事情呢?

    var url1: String? {
        didSet {
            // Do whatever you want, like call a function, once url1 is set
        }
    }
    var url2: String? {
        didSet {
            // Do whatever you want, like call a function, once url2 is set
        }
    }

    storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in
        if let error = error1 {
            print(error.localizedDescription)
            return
        } else if let downloadURL1 = metadata1?.downloadURL()?.absoluteString {
          // Just to make sure it isn't nil
            self.url1 = downloadURL1                
        }
    }

    storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in
        if let error = error2 {
            print(error.localizedDescription)
            return
        } else if let downloadURL2 = metadata2?.downloadURL()?.absoluteString {
            self.url2 = downloadURL2               
        }
    }

但也许我根本不理解你的问题?

编辑:我假设你在viewController或某种类中使用了所有这些

答案 1 :(得分:1)

你说:

  

downloadURL1在关闭之外是nil

是的,这是有道理的,因为这个闭包是异步运行的(即稍后)。您只能在闭包内使用它(或者从完成闭包时启动的某个任务)。

例如,如果您只想在完成这两项操作时对这两项内容执行某些操作,请使用调度组:

var downloadURL1: String?
var downloadURL2: String?

let group = dispatch_group_create()

dispatch_group_enter(group)
storageRef.child(filePath1).putData(data1, metadata: metaData) { (metadata1, error1) in
    defer { dispatch_group_leave(group) }

    if let error = error1 {
        print(error.localizedDescription)
        return
    } else {
        downloadURL1 = metadata1!.downloadURL()!.absoluteString                
    }
}

dispatch_group_enter(group)
storageRef.child(filePath2).putData(data2, metadata: metaData) { (metadata2, error2) in
    defer { dispatch_group_leave(group) }

    if let error = error2 {
        print(error.localizedDescription)
        return
    } else {
        downloadURL2 = metadata2!.downloadURL()!.absoluteString
    }
}

dispatch_group_notify(group, dispatch_get_main_queue()) {
    // you use `downloadURL1` and `downloadURL2` here
}

// but not here