加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Swift:异步回调

发布时间:2020-12-15 02:00:01 所属栏目:百科 来源:网络整理
导读:如何在swift中进行异步回调?我正在为我的应用程序写一个框架,因为它应该运行在iOS和OS X上。所以我把不是特定于设备的主要代码放在这个框架中,它也处理对我的在线api的请求。显然,我也想要应用程序的GUI,因此,一旦api请求完成,我的ViewController将作
如何在swift中进行异步回调?我正在为我的应用程序写一个框架,因为它应该运行在iOS和OS X上。所以我把不是特定于设备的主要代码放在这个框架中,它也处理对我的在线api的请求。显然,我也想要应用程序的GUI,因此,一旦api请求完成,我的ViewController将作出反应。在Objective-C中,我通过保存包含id变量中必须调用的函数的视图,并将函数本身保存在选择器变量中。然后我使用以下代码调用该函数:

SEL selector = callbackMethod;
((void (*)(id,SEL))[callbackViewController methodForSelector:selector])(callbackViewController,selector);

如何快速完成这项工作?还是有更好的方法呢?

我非常感谢你的帮助!

解决方法

我在以下要点中共享了我用于此场景的模式: https://gist.github.com/szehnder/84b0bd6f45a7f3f99306

基本上,我创建一个单一的DataProvider.swift设置一个AFNetworking客户端。然后View Controller在DataProvider上调用方法,每个都由一个被定义为一个名为ServiceResponse的类型的闭包终止。此关闭返回字典或错误。

它允许您非常干净地(imo)从VC调用异步数据操作,并非常清楚地指示当异步响应返回时要执行的操作。

DataProvider.swift

typealias ServiceResponse = (NSDictionary?,NSError?) -> Void

class DataProvider: NSObject {

    var client:AFHTTPRequestOperationManager?
    let LOGIN_URL = "/api/v1/login"

    class var sharedInstance:DataProvider {
        struct Singleton {
            static let instance = DataProvider()
        }
        return Singleton.instance
    }

    func setupClientWithBaseURLString(urlString:String) {
        client = AFHTTPRequestOperationManager(baseURL: NSURL.URLWithString(urlString))
        client!.operationQueue = NSOperationQueue.mainQueue()
        client!.responseSerializer = AFJSONResponseSerializer()
        client!.requestSerializer = AFJSONRequestSerializer()
    }

    func loginWithEmailPassword(email:String,password:String,onCompletion: ServiceResponse) -> Void {
        self.client!.POST(LOGIN_URL,parameters: ["email":email,"password":password],success: {(operation:AFHTTPRequestOperation!,responSEObject:AnyObject!) -> Void in

            self.setupClientWithBaseURLString("http://somebaseurl.com")

            let responseDict = responSEObject as NSDictionary
                // Note: This is where you would serialize the nsdictionary in the responSEObject into one of your own model classes (or core data classes)
                onCompletion(responseDict,nil)
            },failure: {(operation: AFHTTPRequestOperation!,error:NSError!) -> Void  in
                onCompletion(nil,error)
            })
    }
}

MyViewController.swift

import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(animated: Bool)  {
        super.viewWillAppear(animated)
        DataProvider.sharedInstance.loginWithEmailPassword(email:"some@email.com",password:"somepassword") { (responSEObject:NSDictionary?,error:NSError?) in

            if (error) {
                println("Error logging you in!")
            } else {
                println("Do something in the view controller in response to successful login!")
            }
        }
    }  
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读