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!") } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |