关闭时未调用 Alamofire 请求
Posted
技术标签:
【中文标题】关闭时未调用 Alamofire 请求【英文标题】:Alamofire Request Not Being Called in Closure 【发布时间】: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)
。关于为什么会发生这种情况以及如何解决它的任何想法?
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于关闭时未调用 Alamofire 请求的主要内容,如果未能解决你的问题,请参考以下文章
使用 OHHTTPStubs 模拟时未达到 Alamofire 响应块
关闭时未收到 NSNotificationCenter 通知