Skip to content

Instantly share code, notes, and snippets.

@noppefoxwolf
Created September 27, 2019 06:07
Show Gist options
  • Save noppefoxwolf/511a1646cd4ef53a1cbc4379a8d1b2ed to your computer and use it in GitHub Desktop.
Save noppefoxwolf/511a1646cd4ef53a1cbc4379a8d1b2ed to your computer and use it in GitHub Desktop.
Generambaのswift_viperテンプレートでクラッシュするパターン
//
// 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)
}
}
}
@noppefoxwolf
Copy link
Author

lockでselfが保持されるが、outputは解放されているのでself?.outputはForce Unwrapでクラッシュする

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment