首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >UIViewController不会取消初始化(mvvm +协调器)

UIViewController不会取消初始化(mvvm +协调器)
EN

Stack Overflow用户
提问于 2018-04-30 09:06:36
回答 1查看 577关注 0票数 1

我因为这个问题头疼。为什么我的SplashscreenViewController不能反初始化?你们在下面的代码中看到了任何潜在的保留周期吗?我试图检查Malloc堆栈,但找不到任何有用的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final class SplashscreenViewController: UIViewController {
    var viewModel: SplashscreenViewModelType!

    private let animationStartScale: CGFloat = 0.75
    private let animationEndScale: CGFloat = 1.0
    private let animationDuration: TimeInterval = 0.4

    private let splashscreenDuration: TimeInterval = 1.5

    @IBOutlet private weak var logoImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        animateLogo(scale: animationStartScale)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        DispatchQueue.main.asyncAfter(deadline: .now() + splashscreenDuration, execute: { [weak self] in
            self?.viewModel.onFinish.onNext(())
        })
    }

    private func animateLogo(scale: CGFloat) {
        UIView.animate(withDuration: animationDuration, animations: {
            self.transformImage(scale: scale)
        }, completion: { _ in
            if scale == self.animationStartScale {
                self.animateLogo(scale: self.animationEndScale)
            } else {
                self.animateLogo(scale: self.animationStartScale)
            }
        })
    }

    private func transformImage(scale: CGFloat) {
         logoImageView.transform = CGAffineTransform(scaleX: scale, y: scale)
    }
}

持有SplaschreenViewController实例的类是它的协调器。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final class SplashscreenCoordinator: BaseCoordinator {
    private let window: UIWindow

    init(window: UIWindow) {
        self.window = window
    }

    override func start() -> Observable<Void> {
        let vc: SplashscreenViewController = SwinjectStoryboard.instantiateInitialViewController()
        window.rootViewController = vc
        window.makeKeyAndVisible()

        let onFinish = vc.viewModel.onFinish
            .asObservable()
            .flatMap { [unowned self] _ -> Observable<Void> in
                guard self.window.rootViewController == vc else {
                    return Observable<Void>.empty()
                }
                if UserPreferencesManager.isLoggedIn() {
                    return self.startAppForLoggedInUser()
                } else {
                    return self.startAppForAnonymousUser()
                }
            }

        return onFinish
    }

    private func startAppForLoggedInUser() -> Observable<Void> {
        let tabBar = TabBarCoordinator(window: window)
        return coordinate(to: tabBar)
    }

    private func startAppForAnonymousUser() -> Observable<Void> {
        let startCoordinator = StartCoordinator(window: window)
        return coordinate(to: startCoordinator)
    }
}

以及来自BaseCoordinator的一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
private func store(coordinator: BaseCoordinator) {
    childCoordinators[coordinator.identifier] = coordinator
}

private func free(coordinator: BaseCoordinator) {
    childCoordinators[coordinator.identifier] = nil
}

func coordinate(to coordinator: BaseCoordinator) -> Observable<Void> {
    store(coordinator: coordinator)
    return coordinator.start()
        .do(onNext: { [weak self] _ in
            self?.free(coordinator: coordinator)
        })
}
...

提前感谢你的回答!

EN

回答 1

Stack Overflow用户

发布于 2018-05-01 03:52:48

我可以从以下两个方面了解如何防止SplashscreenViewController释放:

如果未释放

  • 所在的window,则返回rootViewController。记住,应用程序保留了key window。
  1. 在您的start()函数中,Observable闭包保留了vc变量。可以显式地或在DisposeBag.

中将此Observable保留在其他位置

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50097291

复制
相关文章
UIViewController初始化没有 init 导致的 Bug
话说 *** Assertion failure in UITraitCollection * _Nonnull _UIGetCurrentFallbackTraitCollection(void)(), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3899.13.13/_UIFallbackEnvironment.m:91
韦弦zhy
2019/11/11
2.7K0
UIViewController present UIViewController 的问题
今天写了个demo才发现,当尝试在函数: func application(_ application: UIApplication, didFinishLaunchingWithOptions la
SheltonWan
2019/07/05
1.1K0
iOS架构设计:揭秘MVC, MVP, MVVM以及VIPER
你将了解到在iOS环境下如何进行系统架构设计。我们将简单回顾一些流行的框架,并通过实践一些小例子来比较它们的理论。
iOSSir
2023/03/19
1.4K0
iOS架构设计:揭秘MVC, MVP, MVVM以及VIPER
寻找协调器FindCoordinatorRequest请求流程
我们在分析消费者的时候, 有看到调用FindCoordinatorRequest的请求
石臻臻的杂货铺[同名公众号]
2022/09/28
3030
寻找协调器FindCoordinatorRequest请求流程
Kafka 核心组件之协调器
假设某 topic 有4个分区,消费者组中只有一个消费者,那么这个消费者将消费全部 partition 中的数据。
CoderJed
2018/09/13
3.1K0
Kafka 核心组件之协调器
android定时器取消,Android定时器崩溃取消
我有一个定时器运行,然后熄灭,并做了一些事情,定时器启动罚款。Android定时器崩溃取消
全栈程序员站长
2022/09/15
1.2K0
聊聊iOS中的 MVC、MVP、MVVM以及 VIPER等代码组织方式
但是现实中我们的View依然跟Model耦合,因为如果完全按照这个理想化的MVC的话,View(cell)层的设置都应该在 Controller中,这样的话,Controller会更臃肿。
進无尽
2018/09/12
4.3K0
聊聊iOS中的 MVC、MVP、MVVM以及 VIPER等代码组织方式
UIViewController生命周期
UIViewController采用懒加载的方式,也就是说第一次访问到view属性时才会加载或创建它。由于视图由视图控制器管理,所以讨论视图的加载方式时,主要讨论视图控制器的加载方式。
Helloted
2022/06/06
2K0
UIViewController生命周期
iOS 转场动画探究(二)
这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容:        上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个小实例解释完,这篇还有一点我们接着总结:        Demo的下载地址这里再发一次: 这里是Demo的下载地址 5、  转场协调器协议 UIViewControllerTransitionCoordinator        可以通过需要产生动画效果的视图控制器的transitionCoord
Mr.RisingSun
2018/01/15
1.4K0
iOS 转场动画探究(二)
[干货分享]一篇可能会让你爱上MVVM与ReactiveCocoa的文章
ios122
2018/01/02
1.3K0
iOS 转场动画探究(二)
这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一)
Mr.RisingSun
2018/07/31
8680
iOS 转场动画探究(二)
iOS14开发-UIViewController
UIViewController 可以理解为 App 的界面,负责管理 UIView 中显示的内容和用户的交互,主要有以下作用:
YungFan
2021/03/02
2.4K0
【iOS】UIViewController生命周期
2》假设view在内存中,则直接载入。相反,假设不存在。则UIViewController调用loadView方法。
全栈程序员站长
2022/07/06
8040
【iOS】UIViewController生命周期
iOS NSString类型转UIViewController
NSString * path = [[NSBundle mainBundle] pathForResource:@"ViewControllers" ofType:@"plist"];
用户9758184
2022/05/18
4900
UIViewController生命周期分析
做一个实验,通过实验来分析viewController的生命周期。 和生命周期几个相关的方法 - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"FirstVC viewDidLoad"); } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear]; NSLog(@"FirstVC viewWillAppear"); } - (void)didRe
xferris
2018/06/01
7960
tensorflow中协调器 tf.train.Coordinator
TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候, 队列必须能被正确地关闭。TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用。
狼啸风云
2019/07/02
1.3K0
tensorflow中协调器 tf.train.Coordinator
iOS17适配指南之UIViewController
YungFan
2023/07/09
9040
iOS17适配指南之UIViewController
VCTransitionsLibrary –自定义iOS交互式转场动画的库
本文介绍了一种用于iOS的交互式转场实现方案,通过使用UIKit Dynamics和UIKit Layout实现自定义转场效果。具体实现包括两个部分:一是交互式转场动画的实现,通过CGAffineTransformAnimation结合UIView.animateWithDuration()方法实现;二是交互式转场交互的实现,通过监听UIViewControllerTransitionCoordinator方法实现。该方案适用于界面之间的复杂转场交互场景,可以自定义转场动画和交互逻辑,实现更加顺滑、自然的界面转场效果。
ios122
2018/01/02
1.6K0
UIViewController声明周期-iOS11新增UIViewController声明周期-iOS11新增
class subViewController: UIViewController { //nib文件的初始化 override init(nibName nibNameOr
用户8893176
2021/08/09
6770
点击加载更多

相似问题

MVVM协调器和弹出UIViewController

30

UIViewController未取消初始化

10

如果协调器不在RxSwift中,那么在RxSwift + MVVM +协调器的情况下,协调器会去哪里?

35

UIViewController与UIView之间的协调

21

从堆栈中弹出时,不会取消分配ARC UIViewController

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文