FB / Swift:如何通过FBSDKGraphRequest中的for循环追加数组?

时间:2015-05-26 22:52:52

标签: facebook swift facebook-graph-api for-loop

在下面的代码中,我在异步调用中通过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--
                                        }
                                    }
                                })
                            }
                        }
                    }
                }
            }
        })
    }
}

1 个答案:

答案 0 :(得分:1)

FBSDKGraphRequest是异步的,因此当你的程序仍然在主线程中运行时,它将在后台线程中发生,此时你的后台线程将使用println命令已经执行的数据返回。针对您的问题的最佳解决方案之一是为结果添加观察者,以便在发生时通知您。添加观察者到数组可能有点技巧,我想让你保持简单,所以我建议你创建一个布尔变量,告诉你什么时候值完成更改。为此,您需要创建像这样的变量

var arrayDidChange:Bool = false {
    didSet{
        if arrayDidChange{
            callFuncDataReadArrayHere()
        }
    } 
}

现在,每次更改数组中的值(添加或编辑)时,都会将arrayDidChange设置为true,在阅读完所有内容后,您需要将arrayDidChange设置为false。

这样,您将始终确保在填充后访问数组中的值。

我希望能帮到你!