【问题标题】:Alamofire Request Not Being Called in Closure关闭时未调用 Alamofire 请求
【发布时间】:2017-08-10 12:56:46
【问题描述】:

我无法让我的 Alamofire 调用在 Swift 中执行我的 json Closure。以下是我的 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)
        }
    }
}

下面是我的 Model 课,Song:

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

    }

}

下面是我的 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 数据,这些数据在我的 NetworkService 文件中进行管理。我在NetworkingService.shared.getSong { (json) in 设置了一个断点。如果 JSON 数据正在打印出来,我相信这个闭包会发生错误:(json)。关于为什么会发生这种情况以及如何解决它的任何想法?

【问题讨论】:

    标签: swift closures alamofire swifty-json


    【解决方案1】:

    在您的第一个方法中,您定义了一个您从不调用的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) 时出现以下错误:无法将类型“DataResponse”的值转换为预期的参数类型“JSON”
    • 我只是编辑我的答案,将response 替换为response.result.value 这应该包含一个对应于json结果的字典
    • xcode 想让我将 response.result.value 小写为 'as! JSON',但这会导致崩溃并显示以下警告:无法将类型'__NSSingleEntryDictionaryI'(0x6180002450e8)的值转换为'SwiftyJSON.JSON'(0x110078038)。我认为您非常接近并指出了我的一些非常明显的失误(谢谢!)
    • 如果你使用 swiftyJson 你可以这样做:let json = JSON(responseData.result.value!) 然后completionHandler(json)
    • 对您有帮助吗?你找到解决办法了吗?
    【解决方案2】:

    我能够解决我的问题:

    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)
    
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      根据此代码,我认为您错过了致电completionHandler(response)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        • 2019-12-21
        • 1970-01-01
        相关资源
        最近更新 更多