Swift 关闭时未调用Alamofire请求

Swift 关闭时未调用Alamofire请求,swift,closures,alamofire,swifty-json,Swift,Closures,Alamofire,Swifty Json,我很难让Alamofire调用在Swift中执行json闭包。下面是我的NetworkingService文件: import Foundation import Alamofire import SwiftyJSON class NetworkingService { static let shared = NetworkingService() private init() {} func getSong(completionHandler: @escapin

我很难让Alamofire调用在Swift中执行json闭包。下面是我的NetworkingService文件:

import Foundation
import Alamofire
import SwiftyJSON


class NetworkingService {

    static let shared = NetworkingService()
    private init() {}

    func getSong(completionHandler: @escaping (JSON) -> Void) {
        Alamofire.request("http://10.0.1.7/myiosapp/v1/songs.php", method: .get, parameters: nil, encoding: URLEncoding(), headers: nil).responseJSON { (response) in
            print(response)
        }
    }
}
下面是我的模型课,宋:

import Foundation
import SwiftyJSON

struct Song {

    let trackName: String
    let trackArtist: String
    let trackFile: String

    // failable intializer
    init?(json: JSON) {
        guard let trackName = json["track"].string,
        let trackArtist = json["artist"].string,
        let trackFile = json["file"].string
            else { return nil }
        self.trackName = trackName
        self.trackArtist = trackArtist
        self.trackFile = trackFile

    }

}
以下是my HomeController文件中的相关代码:

import UIKit
import SwiftyJSON

class HomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

        showJSON()

    }

    var songs = [SongTest]()

    func showJSON() {
        print("This print outs")
        NetworkingService.shared.getSong { (json) in
            print("This does not print out")
            self.songs = []
            if let listOfSongs = json["songs"].array {
                for item in listOfSongs {
                    let song = SongTest(json: item)
                    self.songs.append(song!)
                }

                for r in self.songs {
                    print(r.trackName)
                    print(r.trackArtist)
                    print(r.trackFile)
                }
            }
        }

    }
}

在我的HomeController中,我能够在控制台中看到(“此打印输出”)以及url中的JSON数据,该url在我的NetworkService文件中管理。我已经在中的
NetworkingService.shared.getSong{(json)处设置了一个断点。如果json数据正在打印出来,这会让我相信这个闭包发生了错误:
(json)
。关于为什么会发生这种情况以及如何修复它,有什么想法吗?

在第一个方法中,您定义了一个从不调用的
completionHandler
: 这应该是有效的:

func getSong(completionHandler: @escaping (JSON) -> Void) {
    Alamofire.request("http://10.0.1.7/myiosapp/v1/songs.php", method: .get, parameters: nil, encoding: URLEncoding(), headers: nil).responseJSON { (response) in
        print(response)
        completionHandler(response.result.value)
    }
}

根据这段代码,我认为您没有调用completionHandler(response)

我能够解决我的问题:

class NetworkingService {

    static let shared = NetworkingService()
    private init() {}

    func getSong(completionHandler: @escaping (JSON) -> Void) {
        Alamofire.request("http://10.0.1.7/myiosapp/v1/songs.php", method: .get, parameters: nil, encoding: URLEncoding(), headers: nil).responseJSON { (response) in

            guard let value = response.result.value else {
                completionHandler(response.result.error as! JSON)
                return
            }

            let swiftyJsonVar = JSON(value)
            completionHandler(swiftyJsonVar)

        }
    }
}

当我尝试调用completionHandler(响应)时我得到以下错误:无法将“DataResponse”类型的值转换为预期的参数类型“JSON”,我只是编辑我的答案,将
response
替换为
response.result.value
这应该包含一个与JSON resultxcode对应的字典,它希望我将response.result.value downcase设置为“as!JSON”,但这会导致崩溃以下警告:无法将类型为“\uu NSSingleEntryDictionaryI”(0x6180002450e8)的值强制转换为“SwiftyJSON.JSON”(0x110078038)。我认为您非常接近,并且我已经指出了一些非常明显的错误(谢谢!)如果您使用SwiftyJSON,您可以这样做:
让JSON=JSON(responseData.result.value!)
然后
completionHandler(json)
它对您有帮助吗?您找到解决方案了吗?