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