快速向类函数添加回调
Posted
技术标签:
【中文标题】快速向类函数添加回调【英文标题】:Adding a callback to a class function in swift 【发布时间】:2015-01-12 22:25:39 【问题描述】:在我的项目中,我创建了一个公共类来处理数据请求(JSON、图像等)的网络接口。类内部的函数使用 Alamofire 建立网络连接并下载 JSON 文件。
类和函数如下:
import Foundation
import Alamofire
public class DataConnectionManager
public class func getJSON(AppModule:String, callback:(Int) -> Void) -> Void
switch(AppModule)
case "Newsfeed":
Alamofire.request(.GET, "http://some-site.com/api/", encoding: .JSON).responseJSON (_, _, JSONData, _) in
if JSONData != nil
jsonHolder.jsonData = JSONData!
print("start")
callback(1)
else
callback(0)
break
default:
break
我在我的项目中调用该函数,如下所示:
DataConnectionManager.getJSON("Newsfeed", callback: (intCheck : Int) -> Void in
if intCheck == 1
println("Success")
else
println("Failure")
)
应用程序将启动而不会出现任何错误,但我的健全性检查不会打印出来。事实上,当我这样做时,Alamofire.request 也不会抓取 JSON 提要。
我是否朝着正确的方向前进?
【问题讨论】:
你试过调试吗?是去新闻源吗? 作为一种风格,不要使用大写字母作为变量名。JSONData
看起来像一个类型,而 jsonData
看起来像一个变量。我知道对于以首字母缩略词开头的变量来说这有点模棱两可,但是 Swift 比大多数语言更具有所有类型大写和所有变量小写。
如果有错误,您将丢弃来自responseJSON
的错误。尝试解析它而不是 (_, _, JSONData, error)
if error != nil
。
你应该在 NSURL 中包装你的 url 而不仅仅是输入一个字符串。
另外一个问题:break
语句是多余的。 Swift 自动中断。您需要fallthrough
才能获得通常的 C 行为。
【参考方案1】:
我得到了这个工作,但我不确定如何,确切地说。我根据用户的建议(添加错误检查等)更改了一些东西,它神奇地开始工作。这是我更新的代码,因此人们可以了解如何向他们的函数添加回调。
我的“连接管理器”:
import Foundation
import Alamofire
public class DataConnectionManager
public class func getJSON(AppModule:String, callback:(Int) -> Void) -> Void
switch(AppModule)
case "Newsfeed":
Alamofire.request(.GET, "http://some-site.com/api/", encoding: .JSON).responseJSON (_, _, alamoResponse, error) in
if (error != nil)
println("You've got a response error!")
callback(0)
else
if alamoResponse != nil
jsonHolder.jsonData = alamoResponse!
callback(1)
else
println("You've got some random error")
callback(0)
break
default:
break
我对函数的调用:
DataConnectionManager.getJSON("Newsfeed", callback: (intCheck : Int) -> Void in
if intCheck == 1
self.createTable()
else
println("Failure")
)
【讨论】:
【参考方案2】:我正在使用 swift 2.0 + SwiftyJSON,这是我实现此功能的代码:
class func getJSON(AppModule:String, urlToRequest: String, resultJSON:(JSON) -> Void) -> Void
var returnResult: JSON = JSON.nullJSON
switch(AppModule)
case "all":
request(.GET, urlToRequest)
.responseJSON (_, _, result) in
if (result.isFailure)
print("You've got a response error!")
resultJSON(nil)
else
if (JSON(result.value!) != nil)
returnResult = JSON(result.value!)
resultJSON(returnResult)
else
print("You've got some random error")
break
default:
break
然后像这样调用函数:
DataManager.getJSON("all",urlToRequest: "myurl.com", resultJSON: (result: JSON) -> Void in
if (result == nil)
// error with result json == nil
return
else
//do something with json result
)
希望这会有所帮助。
【讨论】:
以上是关于快速向类函数添加回调的主要内容,如果未能解决你的问题,请参考以下文章