使用Swift 3和Alamofire 4后未收到响应

3

我在将代码改为Swift 3并使用Alamofire 4后遇到了问题。

在使用Alamofire 4和Swift 3之前,我的代码完美运行。但是当我改用Swift 3和Alamofire 4后,出现了许多错误。虽然我已经修复了所有错误,但还存在一个问题:我没有得到任何响应!

以下是我目前使用的Swift 3和Alamofire 4代码:

import UIKit
import Alamofire

protocol VideoModelDelegate{
    func dataReady()
}


class VideoModel: NSObject {

    let API_KEY = "xxxxxxxxxxxxxxxxx"
    let UPLOADS_PLAYLIST_ID = "PLc4t1-K0nthvSUhYtc43BiG-Z9LK2mw5D"


    var videoArray = [Video]()

    var delegate: VideoModelDelegate?

    let urladdress = "https://www.googleapis.com/youtube/v3/playlistItems"


    func getFeedVideos() {

        Alamofire.request("https://www.googleapis.com/youtube/v3/playlistItems", method: .get, parameters: ["part":"snippet", "playlistId": UPLOADS_PLAYLIST_ID,"key": API_KEY, "maxResults": "50"], encoding: JSONEncoding.default).responseJSON(completionHandler: { (response) -> Void in

            print("##############################")
            print(response)
            print("##############################")



            if let JSON = response.result.value as? [String: Any] {

                print(JSON)

                var arrayOfVideos = [Video]()

                if let items = JSON["items"] as? [[String : Any]] {

                    for video in items {
                        print(JSON)

                        let videoObj = Video()
                        videoObj.videoId = (video as NSDictionary).value(forKeyPath:"snippet.resourceId.videoId") as! String

                        videoObj.videoTitle = (video as NSDictionary).value(forKeyPath:"snippet.title") as! String

                        videoObj.videoDescription = video["snippet.description"] as! String

                        if video[ "snippet.thumbnails.maxres.url"] != nil {
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.maxres.url"] as! String
                        }
                        else if video["snippet.thumbnails.hqdefault.url"] != nil{
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.hqdefault.url"] as! String

                        }
                        else if video["snippet.thumbnails.sddefault.url"] != nil{
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.sddefault.url"] as! String

                        }
                        else if video["snippet.thumbnails.mqdefault.url"] != nil{
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.mqdefault.url"] as! String

                        }

                        else if video["snippet.thumbnails.default.url"] != nil{
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.default.url"] as! String

                        }
                        else{

                        }



                        arrayOfVideos.append(videoObj)


                        if self.delegate != nil {
                            self.delegate!.dataReady()
                        }
                    }
                }
                else{
                    print("NOO")
                }
            }

        })
    }
}

我之前的代码一直运行良好:

import UIKit
import Alamofire

protocol VideoModelDelegate{
    func dataReady()
}


class VideoModel: NSObject {

    let API_KEY = "xxxx"
    let UPLOADS_PLAYLIST_ID = Video().playlistID

    var videoArray = [Video]()

    var delegate:VideoModelDelegate?


    func getFeedVideos(){

        // Fetch the videos dynamically using YouTube Data API
        Alamofire.request(.GET, "https://www.googleapis.com/youtube/v3/playlistItems", parameters: ["part":"snippet", "playlistId":UPLOADS_PLAYLIST_ID, "key":API_KEY, "maxResults":50], encoding: ParameterEncoding.URL, headers: nil).responseJSON { (response) in

            if let JSON = response.result.value {

                var arrayOfVideos = [Video]()
                for video in JSON["items"] as! NSArray{
                    //print(video)

                    // Create video objects off of the JSON response
                    let videoObj = Video()
                    videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as! String
                    videoObj.videoTitle = video.valueForKeyPath("snippet.title") as! String
                    videoObj.videoDescription = video.valueForKeyPath("snippet.description") as! String


                    if video.valueForKeyPath("snippet.thumbnails.maxres.url") != nil {
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as! String
                    }
                    else if video.valueForKeyPath("snippet.thumbnails.hqdefault.url") != nil{
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.hqdefault.url") as! String

                    }
                    else if video.valueForKeyPath("snippet.thumbnails.sddefault.url") != nil{
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.sddefault.url") as! String

                    }
                    else if video.valueForKeyPath("snippet.thumbnails.mqdefault.url") != nil{
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.mqdefault.url") as! String

                    }
                    else{
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.default.url") as! String
                    }

                    arrayOfVideos.append(videoObj)

                }

                // when all the video objects have been constructed, assign the array to the VideoModel property
                self.videoArray = arrayOfVideos.reverse()

                // Notify the delegate the data is ready
                if self.delegate != nil{
                    self.delegate!.dataReady()
                }
            }
        }

    }

}

当我尝试打印响应时,日志中会显示以下内容:

FAILURE: 错误领域=kCFErrorDomainCFNetwork,代码=303,"(null)",UserInfo={NSErrorPeerAddressKey={length = 28, capacity = 28, bytes = 0x1c1e01bb000000002607f8b040090809 ... 0000200a00000000},_kCFStreamErrorCodeKey=-2201,_kCFStreamErrorDomainKey=4}


有没有获取到任何 log 信息? - aircraft
请注意,之前你使用了 parameter encoding,现在你正在使用 encoding: JSONEncoding.default,你有检查过吗? - Rashwan L
1
@user3707644,谢谢您的提问。我之前也遇到过同样的问题。 - Emil Sabitov
1个回答

8

你尝试了使用编码方式:JSONEncoding.default。

编码方式应该是URLEncoding.default。


在Alamofire 4中没有名为ParameterEncoding.URL的东西。 - Rashwan L
1
请尝试使用URLEncoding.default而不是JSONEncoding.default。 - Hiroki Murahi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接