簡體   English   中英

沒有關閉Alamofire請求

[英]Alamofire Request Not Being Called in Closure

我無法讓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)
        }
    }
}

以下是我的模型類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)發生了錯誤。 關於為什么發生這種情況以及如何解決的任何想法?

在您的第一個方法中,定義一個從未調用過的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)
    }
}

我能夠解決我的問題:

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(response)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM