Swift - 变量丢失数据
Swift - Variable lost data
Xcode 8.1,Swift 2.3,iOS 10.1,我使用 Firebase
我不会在闭包之外访问数据。我想获取 downloadURL1 和 downloadURL2,比如 self.url1 = downloadURL1
但是downloadURL1在闭包外是nil。
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
}
}
如果我没看错,你是说你不能在闭包之外下载 downloadURL1 和 downloadURL2 的值?
嗯,如果是这样,那是完全正常的。您应该先在闭包之外声明您的变量。但是尝试在闭包之外使用这两个变量的值是行不通的,因为它是异步的。
因此您可能还想使用它们的 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 或某种 class 中使用所有这些
你说:
downloadURL1
is nil
outside closure.
是的,这是有道理的,因为这个闭包异步运行(即稍后)。您只能在闭包内使用它(或在闭包完成后启动的某些任务)。
例如,如果你想对这两个下载做一些事情,只有当它们都完成时,使用 would dispatch group:
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
Xcode 8.1,Swift 2.3,iOS 10.1,我使用 Firebase
我不会在闭包之外访问数据。我想获取 downloadURL1 和 downloadURL2,比如 self.url1 = downloadURL1
但是downloadURL1在闭包外是nil。
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
}
}
如果我没看错,你是说你不能在闭包之外下载 downloadURL1 和 downloadURL2 的值?
嗯,如果是这样,那是完全正常的。您应该先在闭包之外声明您的变量。但是尝试在闭包之外使用这两个变量的值是行不通的,因为它是异步的。
因此您可能还想使用它们的 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 或某种 class 中使用所有这些
你说:
downloadURL1
isnil
outside closure.
是的,这是有道理的,因为这个闭包异步运行(即稍后)。您只能在闭包内使用它(或在闭包完成后启动的某些任务)。
例如,如果你想对这两个下载做一些事情,只有当它们都完成时,使用 would dispatch group:
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