函数在didSelectRowAtIndexPath中的代码之后执行,即使它不应该

时间:2016-01-21 22:40:37

标签: ios

我的tableView功能:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    print("VIDEOPLAY AT RUNTIME 3 BLANK \(self.videoPlay)")

    jsonRequestSecond("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2C+contentDetails&maxResults=30&playlistId=UUxEMA4apFhleO3ONQTowMvQ&key=AIzaSyBukkCFuaUubyP7lkP1UAkyS6jS25u5AaQ", indexx: indexPath.row)

    print("VIDEOPLAY AT RUNTIME 2 \(self.videoPlay)")

    let youtubeUrl = "https://www.youtube.com/embed/\(videoPlay)"

    self.youtubeView.allowsInlineMediaPlayback = true

    self.youtubeView.loadHTMLString("<iframe width=\"\(self.youtubeView.frame.width)\" height=\"\(self.youtubeView.frame.height)\" src=\"\(youtubeUrl)?&playsinline=1\" frameborder=\"0\" allowfullscreen scrolling=no></iframe>", baseURL: nil)


    self.tableView.reloadData()
}

我有这个:

func jsonRequestSecond(urlString: String, indexx: Int) {

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)!

    session.dataTaskWithURL(url) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if let responseData = data {
                do {

                    let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments)

                    if let dict = json as? Dictionary<String, AnyObject> {
                        // Get the first dictionary item from the returned items (usually there's just one item).

                        // self.nextPgToken = dict["nextPageToken"] as! String!
                        // print(self.nextPgToken)
                        // self.tableView.reloadData()

                        let items: AnyObject! = dict["items"] as AnyObject!
                        let items2: Array<Dictionary<NSObject, AnyObject>> = dict["items"] as! Array<Dictionary<NSObject, AnyObject>>

                        let firstItemDict = (items as! Array<AnyObject>)[indexx] as! Dictionary<NSObject, AnyObject>
                        // Get the snippet dictionary that contains the desired data.
                        let snippetDict = firstItemDict["snippet"] as! Dictionary<NSObject, AnyObject>
                        let contentDict = firstItemDict["contentDetails"] as! Dictionary<NSObject, AnyObject>
                        // Create a new dictionary to store only the values I care about.
                        var desiredValuesDict: Dictionary<NSObject, AnyObject> = Dictionary<NSObject, AnyObject>()
                        // print(snippetDict)

                        /***********/
                        // print(contentDict["videoId"]!)


                        print(contentDict["videoId"]! as! String)
                        print(contentDict.count)
                        self.videoPlay = contentDict["videoId"]! as! String
                        print("VIDEOPLAY AT RUNTIME 1 \(self.videoPlay)")
                        return;


                        /***********/
                        desiredValuesDict["title"] = snippetDict["title"]
                        desiredValuesDict["description"] = snippetDict["description"]
                        desiredValuesDict["thumbnail"] = ((snippetDict["thumbnails"] as! Dictionary<NSObject, AnyObject>)["default"] as! Dictionary<NSObject, AnyObject>)["url"]
                        // Save the channel's uploaded videos playlist ID.
                        // desiredValuesDict["playlistID"] = ((firstItemDict["contentDetails"] as! Dictionary<NSObject, AnyObject>)["relatedPlaylists"] as! Dictionary<NSObject, AnyObject>)["uploads"]
                        // Append the desiredValuesDict dictionary to the following array.
                        self.channelsDataArray.append(desiredValuesDict)
                        // self.videosIDArray.append(desiredValuesDict)

                        print("TESTING **************************")
                        // Use a loop to go through all video items.
                        for var i=0; i<items2.count; ++i {
                            let playlistSnippetDict = (items2[i] as Dictionary<NSObject, AnyObject>)["snippet"] as! Dictionary<NSObject, AnyObject>
                            // Initialize a new dictionary and store the data of interest.
                            var desiredPlaylistItemDataDict = Dictionary<NSObject, AnyObject>()
                            desiredPlaylistItemDataDict["title"] = playlistSnippetDict["title"]
                            // print(desiredPlaylistItemDataDict["title"])
                            desiredPlaylistItemDataDict["thumbnail"] = ((playlistSnippetDict["thumbnails"] as! Dictionary<NSObject, AnyObject>)["default"] as! Dictionary<NSObject, AnyObject>)["url"]
                            // print(desiredPlaylistItemDataDict["thumbnail"])
                            desiredPlaylistItemDataDict["videoId"] = (playlistSnippetDict["resourceId"] as! Dictionary<NSObject, AnyObject>)["videoId"]
                            // print(desiredPlaylistItemDataDict["videoID"])
                            // Append the desiredPlaylistItemDataDict dictionary to the videos array.
                            self.videosArray.append(desiredPlaylistItemDataDict)
                            self.videosIDArray.addObject(contentDict["videoId"]! as! String)
                            // self.videoPlay = contentDict["videoId"]! as! String
                            self.tableView.reloadData()

                            /*

                            */
                        }
                    }
                } catch {
                    print("Could not serialize")
                }

            }
        })
        }.resume()
}

这是我的输出:

2016-01-21 23:35:49.623 Project[4225:125152] Could not load the "videos-playlists" image referenced from a nib in the bundle with identifier "com.company.project"

pjrr60geles
1
TESTING **************************
VIDEOPLAY AT RUNTIME 3 BLANK 
VIDEOPLAY AT RUNTIME 2 
YW7qrbtcVEE
1
VIDEOPLAY AT RUNTIME 1 YW7qrbtcVEE

你明白我的意思吗? 我先叫jsonRequestSecond,然后再打电话

print("VIDEOPLAY AT RUNTIME 2 \(self.videoPlay)").

我不应该反其道而行吗?

2 个答案:

答案 0 :(得分:1)

您的jsonRequestSecond方法在完成块中使用print语句调用NSURLSession.dataTaskWithURL,然后调用dispatch_async,这样在dataTask完成之后才会调用print语句。< / p>

此代码不是线性的,因此不会线性执行。

答案 1 :(得分:0)

你需要拔出jsonRequestSecond块并从中创建一个自定义方法,这个自定义方法应该有一个协议方法,你可以在你的UIViewcontroller中调用tableView。

iOS不会挂起UI来从URL加载数据。这是不好的做法。您只应该为UI元素调度到主队列。