当前位置: 首页 > 面试题库 >

Swift:异步回调

潘琨
2023-03-14
问题内容

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

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

如何快速完成此任务?还是有更好的方法呢?

非常感谢您的帮助!


问题答案:

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

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


 类似资料:
  • 问题内容: 我正在编写一个函数,该函数采用groupchatID(字符串),并为该群聊返回收件人列表([String])。我正在努力与功能的异步部分。当我运行该函数时,它将正确地将我要查找的用户名数组打印到控制台。虽然,当我调用该函数并尝试打印返回的值时,它始终是一个空数组,因为该函数会在Firebase调用完成之前返回该数组。我正在尝试使用回调,但是我不太了解所有语法。请看一下,让我知道需要更改

  • 问题内容: 我想创建一个函数来检查user_id是否已在我的数据库中。 但是,是第三方Firebase提供的API。它定义为return 。 (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块 错误: 感谢任何帮助。 更新 我正在尝试另一种方式: 不知

  • 几周前刚开始学Node.js....我不明白为什么“products”数组包含null而不是所需的对象.... 在第13行,当我对对象进行控制台日志记录时,我得到了所需的对象,但我不明白当我在map函数完成它的执行后在第40行对它们进行控制台日志记录时,它们为什么是空的.... 如果数组长度是2(这意味着推入成功),为什么里面存储的对象仍然是空的,而不是我想要存储的对象? 控制台输出 订单模式

  • 问题内容: 所以我有一个来自Parse的PFFile对象,并且我试图创建一个函数来检索该PFFile的UIImage表示并将其返回。就像是: 但是,这里的问题很明显。我每次都会得到nil,因为getDataInBackroundWithBlock函数是异步的。有什么方法可以等到检索到UIImage之后再返回image变量?我不知道在这种情况下使用同步getData()是否有效。 问题答案: 是的,

  • 稳定性: 1 - 试验的 async_hooks 模块提供了一个用于注册回调函数的 API,这些回调函数可追踪在 Node.js 应用中创建的异步资源的生命周期。可以通过以下方式使用: const async_hooks = require('async_hooks'); Terminology An asynchronous resource represents an object with

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?