swift - Alamofire 请求未被关闭

标签 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: @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

    }

}

下面是我的 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)。关于为什么会发生这种情况以及如何解决它的任何想法?

最佳答案

在您的第一个方法中,您定义了一个您永远不会调用的 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)
    }
}

关于swift - Alamofire 请求未被关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45614363/

相关文章:

ios - 使用 alamofireimages 缓存

swift - Alamofire:POST 请求,post 参数为 Json

swift - 如何通过 IF 检查字符串的 endIndex?

ios - 使用 iOS Swift 检测外部屏幕

ios - 如何抛出SKSpriteNode?

ios - 将闭包中的值分配给变量 Swift

javascript - JavaScript 中的作用域和闭包问题

iOS IP 故障转移(循环),具有多个 A 记录的 DNS

ios - 是否可以在没有 Web 服务器的情况下创建 App Clip

lisp - 为什么这个 defun 闭包的行为与 defparameter 闭包的行为不同?