gpt4 book ai didi

ios - 将 RACComand 绑定(bind)到 UIViewController 事件

转载 作者:行者123 更新时间:2023-11-28 09:03:37 27 4
gpt4 key购买 nike

我在我的项目中使用 MVVM 模式实现 RAC,现在我开始怀疑了。我对服务器有很多调用,但所有调用都关联到一个 UIButton 并在我的 ViewModel 中处理;现在我需要在加载 UIViewController 时调用服务器。在 MVVM 之前,我只是在 viewDidLoad 方法中创建了一个信号 voilá!,但我不确定是否可以将其放入 ViewController。现在我不知道如何将 RACSignal 绑定(bind)到我的 ViewController 中的事件,最糟糕的是,我不确定这是否是遵循 MVVM 模式的方式。

当我从用户操作(从 UIButton)调用服务器时,我现在正在做的是:

View Controller *

self.someButton.rac_command = viewModel.executeSomeAction
//On success:
self.viewModel.executeLoginCompleted.skip(1).subscribeNextAs {
(isExecuting: Bool) -> () in
//Do something
}
//On error:
self.viewModel.executeSomeActionError.subscribeNextAs {
(error: NSError) -> () in
//Dd something
}

View 模型*

var executeSomeAction: RACCommand?
var executeSomeActionError: RACSignal!
var executeLoginCompleted: RACSignal

executeSomeAction = RACCommand(enabled: combineValidationSignals) {
(any:AnyObject!) -> RACSignal in
println("ANY: \(any)")
return self.executeLoginRequest()
}

executeSomeActionError = executeLogin!.errors
executeLoginCompleted = executeLogin!.executing

当 UIView 加载时,我应该如何创建 RACSignal 或 RACCommand?当然,遵循 MVVM 模式。

谢谢

最佳答案

您有两个选择。一个比另一个更 hacky,但更容易在您的应用程序中实现。

选项 1:

您可以编写 UIViewController 的扩展,使用 associatedObjects 将 viewDidLoadCommand: RACCommand 属性添加到 UIViewController。然后,您调整 UIViewController 的 viewDidLoad() 方法,以便它在 viewDidLoad() 上执行您的命令:

extension UIViewController {
private struct AssociatedKeys {
static var ViewDidLoadCommand: String = "ViewDidLoadCommand"
}

var viewDidLoadCommand: RACCommand? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.ViewDidLoadCommand) as? RACCommand
}
set {
if let newValue = newValue {
objc_setAssociatedObject(
self,
&AssociatedKeys.ViewDidLoadCommand,
newValue as RACCommand?,
UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)
)
}
}
}

func swizzled_viewDidLoad() {
self.swizzled_viewDidLoad()

self.viewDidLoadCommand?.execute(nil)
}
}

// In the appDelegate

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.

method_exchangeImplementations(
class_getInstanceMethod(UIViewController.self, "viewDidLoad"),
class_getInstanceMethod(UIViewController.self, "swizzled_viewDidLoad"))

return true
}

选项 2

您可以继承 UIViewController 并实现 viewDidLoadCommand 并在 viewDidLoad() 中调用它

class ViewControllerSubClass : UIViewController {
var viewDidLoadCommand: RACCommand?

override func viewDidLoad() {
super.viewDidLoad()
self.viewDidLoadCommand?.execute(nil)
}
}

无论您选择哪种方法,您只需在自定义 viewControllers init 方法中设置命令,它就会在 viewDidLoad 上执行。

关于ios - 将 RACComand 绑定(bind)到 UIViewController 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415604/

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