快速向类函数添加回调

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
        
    )

希望这会有所帮助。

【讨论】:

以上是关于快速向类函数添加回调的主要内容,如果未能解决你的问题,请参考以下文章

Android AudioRecord 类 - 快速处理现场麦克风音频,设置回调函数

如何向函数回调添加额外参数

回调函数(callback)是啥? ,,

回调函数是啥意思 啥是回调函数

Vue函数有回调参数,添加参数时如何保留默认回调参数

Vue函数有回调参数,添加参数时如何保留默认回调参数