2017-08-10 59 views
1

我无法让我的Alamofire调用在Swift中执行我的json关闭。下面是我的NetworkingService文件:Alamofire请求在关闭时不被调用

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

回答

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

当我尝试调用completionHandler(响应)时出现以下错误:无法将类型为'DataRes ponse '到预期的参数类型'JSON' – a2b123

+0

我只是编辑我的答案''response.result.value'替换'response'这应该包含与json结果对应的字典 – Maxime

+0

xcode要我downcaset response.result.value为'如! JSON',但这会导致崩溃,并出现以下警告:无法将'__NSSingleEntryDictionaryI'(0x6180002450e8)类型的值转换为'SwiftyJSON.JSON'(0x110078038)。我认为你非常接近,并指出了我非常明显的失误(谢谢!) – a2b123

0

按照这个代码,我想你错过致电completionHandler(response)

1

我能解决我的问题:

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) 

     } 
    } 
}