Created
September 27, 2019 06:07
-
-
Save noppefoxwolf/511a1646cd4ef53a1cbc4379a8d1b2ed to your computer and use it in GitHub Desktop.
Generambaのswift_viperテンプレートでクラッシュするパターン
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ViewController.swift | |
// ViperAsyncIssue | |
// | |
// Created by Tomoya Hirano on 2019/09/27. | |
// Copyright © 2019 Tomoya Hirano. All rights reserved. | |
// | |
import UIKit | |
class RootViewController: UIViewController { | |
let button: UIButton = .init(type: .custom) | |
override func loadView() { | |
super.loadView() | |
button.setTitle("present", for: .normal) | |
button.translatesAutoresizingMaskIntoConstraints = false | |
view.addSubview(button) | |
NSLayoutConstraint.activate([ | |
button.topAnchor.constraint(equalTo: view.topAnchor), | |
button.rightAnchor.constraint(equalTo: view.rightAnchor), | |
button.leftAnchor.constraint(equalTo: view.leftAnchor), | |
button.bottomAnchor.constraint(equalTo: view.bottomAnchor), | |
]) | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
view.backgroundColor = .red | |
button.addTarget(self, action: #selector(onTap), for: .touchUpInside) | |
} | |
@objc func onTap(_ sender: UIButton) { | |
let vc = ViewController.make() | |
present(vc, animated: true, completion: nil) | |
} | |
} | |
class ViewController: UIViewController { | |
var output: Presenter! | |
static func make() -> ViewController { | |
let vc = ViewController() | |
let interactor = Interactor() | |
let presenter = Presenter() | |
presenter.interactor = interactor | |
presenter.view = vc | |
interactor.output = presenter | |
vc.output = presenter | |
return vc | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
view.backgroundColor = .blue | |
output.viewDidLoad() | |
} | |
func changeBackgroundColor() { | |
view.backgroundColor = .green | |
} | |
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { | |
dismiss(animated: true, completion: nil) | |
} | |
} | |
class Presenter { | |
weak var view: ViewController! | |
var interactor: Interactor! | |
func viewDidLoad() { | |
interactor.request() | |
} | |
func didReceivedResponse() { | |
view.changeBackgroundColor() | |
} | |
} | |
class Interactor { | |
weak var output: Presenter! | |
let value: Int = 0 | |
func request() { | |
lock() | |
let _value = value | |
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in | |
print(_value) | |
self?.output.didReceivedResponse() | |
} | |
} | |
func lock() { | |
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { | |
print(self) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
lockでselfが保持されるが、outputは解放されているのでself?.outputはForce Unwrapでクラッシュする