在下面的代码中,我在异步调用中通过for
循环向数组附加值时遇到问题。我在numbersArray
之外声明graphRequest
数组,以便我可以尝试将for
循环中的值附加到它并在请求之外访问它。问题是,因为graphRequest
是异步调用,所以在打印"Boston: \(numbersArray)")
之前会打印"numbersArray: \(numbersArray")"
。
"numbersArray: \(numbersArray")"
在每次循环后打印数组的值,而"Boston: \(numbersArray)")
打印一个空数组,因为它在graphRequest
之前被调用。如何使用{strong> numbersArray
之外的值<{1}}来访问graphRequest
?
class Test {
class func test() {
var numbersArray = [String]()
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
var array = ["1", "2", "3"]
for number in array {
numbersArray.append(number)
}
println("numbersArray: \(numbersArray)")
})
println("Boston: \(numbersArray)")
}
}
更新:以下是我编辑代码的方式。
class Test {
class func test() {
var numbersArray = [String]()
var arrayDidChange:Bool = false {
didSet {
if arrayDidChange {
println("Boston: \(numbersArray)")
}
}
}
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
var array = ["1", "2", "3"]
for number in array {
numbersArray.append(number)
arrayDidChange = true
}
})
arrayDidChange = false
}
}
更新#2:我无法让观察者在此代码中打印一次。我已将arrayDidChange
四处移动,但没有成功。如果我将arrayDidChange = true
语句移出for
循环,则songArray
为空。
class Test {
class func test() {
var songArray = [String]()
var testArray = ["Trap Queen", "Dream Lover", "All Of Me"]
var arrayDidChange: Int = 0 {
didSet {
if arrayDidChange == 0 {
println("Boston: \(songArray)")
}
}
}
arrayDidChange++
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/music.listens", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
if let data = result["data"] as? NSArray {
for songs in data {
if let songData = songs["data"] as? NSDictionary {
if let song = songData["song"] as? NSDictionary {
if let id = song["id"] as? String {
let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "\(id)", parameters: nil)
graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
if let title = result["title"] as? String {
if contains (testArray, title) {
songArray.append(title)
arrayDidChange--
}
}
})
}
}
}
}
}
})
}
}
答案 0 :(得分:1)
FBSDKGraphRequest是异步的,因此当你的程序仍然在主线程中运行时,它将在后台线程中发生,此时你的后台线程将使用println命令已经执行的数据返回。针对您的问题的最佳解决方案之一是为结果添加观察者,以便在发生时通知您。添加观察者到数组可能有点技巧,我想让你保持简单,所以我建议你创建一个布尔变量,告诉你什么时候值完成更改。为此,您需要创建像这样的变量
var arrayDidChange:Bool = false {
didSet{
if arrayDidChange{
callFuncDataReadArrayHere()
}
}
}
现在,每次更改数组中的值(添加或编辑)时,都会将arrayDidChange设置为true,在阅读完所有内容后,您需要将arrayDidChange设置为false。
这样,您将始终确保在填充后访问数组中的值。
我希望能帮到你!