为什么它处于无限循环中?

时间:2015-12-08 06:45:03

标签: ios json swift parse-platform

我正在尝试从json页面捕获数据,并将其存储在数据库中。我现在可以从json页面获取艺术家和标题。我在我的程序中填充一个数组,其中包含从数据中捕获的值以避免重复。当运行for循环并获取值并将它们放入Parsearray时,将启动无限循环。它没有结束,它总是被称为。我知道这是因为我看到“被叫”被多次打印在控制台中并且它不会停止。我该如何解决这个问题?

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated);

    let query = PFQuery(className: "Pointer")
    query.findObjectsInBackgroundWithBlock({
        (objects: [AnyObject]?, error: NSError?) -> Void in
        var objectIDs = objects as! [PFObject]

        for i in 0...objectIDs.count-1{
            self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!)

            print(self.Parsearray)
            print("called")

        }
    })

    self.getSpotify()

}

 func getSpotify(){

    let searchTerm = "tgirish10"
    var endpoint = NSURL(string: "<api URL>")
    var data = NSData(contentsOfURL: endpoint!)


    let task = NSURLSession.sharedSession().dataTaskWithURL(endpoint!) {(data, response, error) -> Void in
        do {
            if let jsonData = data,
                let dict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as? NSDictionary,
                let recent = dict["recenttracks"] as? NSDictionary,
                let items = recent["track"] as? NSArray {
                    for item in items {
                        if let spotifytitle = item["name"] as? String {
                            print("title: \(spotifytitle)")
                            if let spotifyartist = item["artist"]!!["#text"] as? String{
                                print("artist: \(spotifyartist)")


                                let query = PFQuery(className: "Pointer")
                                query.findObjectsInBackgroundWithBlock({
                                    (objects: [AnyObject]?, error: NSError?) -> Void in
                                    var objectIDs = objects as! [PFObject]

                                    for i in 0...objectIDs.count-1{
                                        self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!)

                                        print(self.Parsearray)
                                        print("called")
                                    }

                                    if self.Parsearray.contains(spotifytitle){
                                        print("already in db")

                                    }else{

                                        let objectPointer = PFObject(className: "Pointer")
                                        objectPointer["title"] = spotifytitle
                                        objectPointer["user"] = PFUser.currentUser()
                                        objectPointer["artist"] = spotifyartist
                                        objectPointer.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in

                                            if(error != nil){
                                                print(error)
                                            }else{

                                                print("saved")
                                            }
                                        })

                                    }

                                })


                            }
                        }

                    }
            }
        } catch let jsonError as NSError {
            print(jsonError)
        }


    }
    task.resume()


}

1 个答案:

答案 0 :(得分:0)

除了上述评论中的问题之外,主要问题是您的代码执行以下操作:

  • 从Spotify
  • 获取一些数据
  • 为每个曲目,从Parse获取所有Pointer个对象
  • 对于每个对象,将标题添加到parseArray(所以一段时间后,列表将包含所有标题的多个副本)
  • 然后检查该曲目的标题是否在此列表中

所以循环似乎不是无限的,但你不必要地添加了大量数据。

两个选项:

  • 将标题加载到音轨上的循环

  • 或使用只返回匹配的PFQuery个对象的Pointer,并检查返回的列表是否为空