gpt4 book ai didi

ios - Swift:异步回调

转载 作者:IT王子 更新时间:2023-10-29 05:10:45 27 4
gpt4 key购买 nike

如何在 swift 中进行异步回调?我正在为我的应用程序编写一个小框架,因为它应该在 iOS 和 OS X 上运行。所以我将非特定于设备的主要代码放入该框架中,该框架还处理对我的在线 api 的请求。显然我还希望应用程序的 GUI 以及我的 ViewControllers 在 api 请求完成后立即使用react。在 Objective-C 中,我通过保存包含必须在 id 变量中调用的函数的 View 和在选择器变量中的函数本身来完成此操作。然后我使用以下代码调用该函数:

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

我怎样才能快速完成这个任务?或者有更好的方法吗?

非常感谢您的帮助!

最佳答案

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

基本上,我创建了一个单例 DataProvider.swift 来设置一个 AFNetworking 客户端。然后 View Controllers 调用该 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!")
}
}
}
}

关于ios - Swift:异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com