Suche senden
Hochladen
節子、それViewControllerやない...、FatViewControllerや...。
•
5 gefällt mir
•
30,588 views
Kenji Tanaka
Folgen
iOSDC 2017 前夜祭の資料 #iosdc
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 46
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Spring AOP in Nutshell
Spring AOP in Nutshell
Onkar Deshpande
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
Felice Pescatore
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Fumihiko Shiroyama
REST API のコツ
REST API のコツ
pospome
Functional programming with Java 8
Functional programming with Java 8
LivePerson
Spring data jpa
Spring data jpa
Jeevesh Pandey
Java 8 - Features Overview
Java 8 - Features Overview
Sergii Stets
iOS WKWebViewの魔改造 - iOSDC 2018
iOS WKWebViewの魔改造 - iOSDC 2018
Shingo Fukuyama
Weitere ähnliche Inhalte
Was ist angesagt?
Spring boot
Spring boot
Pradeep Shanmugam
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
Getting started with Spring Security
Getting started with Spring Security
Knoldus Inc.
Rest ful api設計入門
Rest ful api設計入門
Monstar Lab Inc.
Optional in Java 8
Optional in Java 8
Richard Walker
Spring JDBCTemplate
Spring JDBCTemplate
Guo Albert
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
Enpel
Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~
abend_cve_9999_0001
Angular Dependency Injection
Angular Dependency Injection
Nir Kaufman
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
React new features and intro to Hooks
React new features and intro to Hooks
Soluto
Java 8 lambda
Java 8 lambda
Manav Prasad
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
Spring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
Java OCA teoria 4
Java OCA teoria 4
Valerio Radice
Spring Framework - MVC
Spring Framework - MVC
Dzmitry Naskou
SwiftのDI方法につい て最近考えてた話
SwiftのDI方法につい て最近考えてた話
Yahoo!デベロッパーネットワーク
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
Евгений Варфоломеев "Hibernate vs my batis vs jdbc: is there a silver bullet?"
Евгений Варфоломеев "Hibernate vs my batis vs jdbc: is there a silver bullet?"
Anna Shymchenko
java 8 new features
java 8 new features
Rohit Verma
Was ist angesagt?
(20)
Spring boot
Spring boot
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
Getting started with Spring Security
Getting started with Spring Security
Rest ful api設計入門
Rest ful api設計入門
Optional in Java 8
Optional in Java 8
Spring JDBCTemplate
Spring JDBCTemplate
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~
Angular Dependency Injection
Angular Dependency Injection
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
React new features and intro to Hooks
React new features and intro to Hooks
Java 8 lambda
Java 8 lambda
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Spring fest2020 spring-security
Spring fest2020 spring-security
Java OCA teoria 4
Java OCA teoria 4
Spring Framework - MVC
Spring Framework - MVC
SwiftのDI方法につい て最近考えてた話
SwiftのDI方法につい て最近考えてた話
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
Евгений Варфоломеев "Hibernate vs my batis vs jdbc: is there a silver bullet?"
Евгений Варфоломеев "Hibernate vs my batis vs jdbc: is there a silver bullet?"
java 8 new features
java 8 new features
Ähnlich wie 節子、それViewControllerやない...、FatViewControllerや...。
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
NAVER Engineering
jQuery secrets
jQuery secrets
Bastian Feder
Intro programacion funcional
Intro programacion funcional
NSCoder Mexico
Gutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisables
Riad Benguella
Android workshop
Android workshop
Michael Galpin
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Tsuyoshi Yamamoto
Android Best Practices
Android Best Practices
Yekmer Simsek
Swift Delhi: Practical POP
Swift Delhi: Practical POP
Natasha Murashev
Improving android experience for both users and developers
Improving android experience for both users and developers
Pavel Lahoda
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahoda
Droidcon Berlin
Building Lithium Apps
Building Lithium Apps
Nate Abele
Writing Maintainable JavaScript
Writing Maintainable JavaScript
Andrew Dupont
Deep dive into Oracle ADF
Deep dive into Oracle ADF
Euegene Fedorenko
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
Natasha Murashev
Practialpop 160510130818
Practialpop 160510130818
Shahzain Saeed
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
PROIDEA
jQuery secrets
jQuery secrets
Bastian Feder
Prescribing RX Responsibly
Prescribing RX Responsibly
Nareg Khoshafian
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
Andrea Prearo
Ähnlich wie 節子、それViewControllerやない...、FatViewControllerや...。
(20)
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
jQuery secrets
jQuery secrets
Intro programacion funcional
Intro programacion funcional
Gutenberg sous le capot, modules réutilisables
Gutenberg sous le capot, modules réutilisables
Android workshop
Android workshop
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
Android Best Practices
Android Best Practices
Swift Delhi: Practical POP
Swift Delhi: Practical POP
Improving android experience for both users and developers
Improving android experience for both users and developers
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahoda
Building Lithium Apps
Building Lithium Apps
Writing Maintainable JavaScript
Writing Maintainable JavaScript
Deep dive into Oracle ADF
Deep dive into Oracle ADF
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
Practialpop 160510130818
Practialpop 160510130818
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
jQuery secrets
jQuery secrets
Prescribing RX Responsibly
Prescribing RX Responsibly
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
Mehr von Kenji Tanaka
FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた #iosdc
FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた #iosdc
Kenji Tanaka
リリース前のリグレッションテストがめんどい!のでMagic PodでUIテストを試してみる #pixiv_app_night
リリース前のリグレッションテストがめんどい!のでMagic PodでUIテストを試してみる #pixiv_app_night
Kenji Tanaka
ポストモーテムやってみた #yjbonfire
ポストモーテムやってみた #yjbonfire
Kenji Tanaka
2つの同期 4つの状態 #pixiv_ios_arch
2つの同期 4つの状態 #pixiv_ios_arch
Kenji Tanaka
2つの同期 4つの状態 #app_mp
2つの同期 4つの状態 #app_mp
Kenji Tanaka
2つの同期 4つの状態 #roppongiswift
2つの同期 4つの状態 #roppongiswift
Kenji Tanaka
トークンリフレッシュ処理を含むAPIClientのテスト #hakata_test_night
トークンリフレッシュ処理を含むAPIClientのテスト #hakata_test_night
Kenji Tanaka
よく使うテストヘルパーの紹介 #ios_test_night
よく使うテストヘルパーの紹介 #ios_test_night
Kenji Tanaka
Swiftで聞いておぼえるテスト書き
Swiftで聞いておぼえるテスト書き
Kenji Tanaka
設計時空のリファクタリング
設計時空のリファクタリング
Kenji Tanaka
WACATE 2018 Summer
WACATE 2018 Summer
Kenji Tanaka
テスト駆動開発入門 by Swift
テスト駆動開発入門 by Swift
Kenji Tanaka
An iOS Engineer challenges Web.
An iOS Engineer challenges Web.
Kenji Tanaka
エンジニアのためのブログ講座Ver4
エンジニアのためのブログ講座Ver4
Kenji Tanaka
TDDやってみよ
TDDやってみよ
Kenji Tanaka
ストレス社会に生きる、iOSエンジニアにオススメする百合の世界と作品
ストレス社会に生きる、iOSエンジニアにオススメする百合の世界と作品
Kenji Tanaka
iOS 11からのDeviceCheck #とは
iOS 11からのDeviceCheck #とは
Kenji Tanaka
設計に答えはないから探してみよう
設計に答えはないから探してみよう
Kenji Tanaka
iOS 11からのアプリ間ファイル共有
iOS 11からのアプリ間ファイル共有
Kenji Tanaka
iOS 11からのアプリ間ファイル共有_公開用
iOS 11からのアプリ間ファイル共有_公開用
Kenji Tanaka
Mehr von Kenji Tanaka
(20)
FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた #iosdc
FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた #iosdc
リリース前のリグレッションテストがめんどい!のでMagic PodでUIテストを試してみる #pixiv_app_night
リリース前のリグレッションテストがめんどい!のでMagic PodでUIテストを試してみる #pixiv_app_night
ポストモーテムやってみた #yjbonfire
ポストモーテムやってみた #yjbonfire
2つの同期 4つの状態 #pixiv_ios_arch
2つの同期 4つの状態 #pixiv_ios_arch
2つの同期 4つの状態 #app_mp
2つの同期 4つの状態 #app_mp
2つの同期 4つの状態 #roppongiswift
2つの同期 4つの状態 #roppongiswift
トークンリフレッシュ処理を含むAPIClientのテスト #hakata_test_night
トークンリフレッシュ処理を含むAPIClientのテスト #hakata_test_night
よく使うテストヘルパーの紹介 #ios_test_night
よく使うテストヘルパーの紹介 #ios_test_night
Swiftで聞いておぼえるテスト書き
Swiftで聞いておぼえるテスト書き
設計時空のリファクタリング
設計時空のリファクタリング
WACATE 2018 Summer
WACATE 2018 Summer
テスト駆動開発入門 by Swift
テスト駆動開発入門 by Swift
An iOS Engineer challenges Web.
An iOS Engineer challenges Web.
エンジニアのためのブログ講座Ver4
エンジニアのためのブログ講座Ver4
TDDやってみよ
TDDやってみよ
ストレス社会に生きる、iOSエンジニアにオススメする百合の世界と作品
ストレス社会に生きる、iOSエンジニアにオススメする百合の世界と作品
iOS 11からのDeviceCheck #とは
iOS 11からのDeviceCheck #とは
設計に答えはないから探してみよう
設計に答えはないから探してみよう
iOS 11からのアプリ間ファイル共有
iOS 11からのアプリ間ファイル共有
iOS 11からのアプリ間ファイル共有_公開用
iOS 11からのアプリ間ファイル共有_公開用
Kürzlich hochgeladen
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
Precisely
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
Matt Ray
20150722 - AGV
20150722 - AGV
Jamie (Taka) Wang
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
Adam Moalla
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
DianaGray10
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
D Cloud Solutions
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
Daniel Santiago Silva Capera
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
DianaGray10
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
Jamie (Taka) Wang
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
Jamie (Taka) Wang
20230104 - machine vision
20230104 - machine vision
Jamie (Taka) Wang
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
dgelyza
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
David Newbury
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
shyamraj55
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
Adtran
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
Mahmoud Rabie
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
Udaiappa Ramachandran
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
UiPathCommunity
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UbiTrack UK
Kürzlich hochgeladen
(20)
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
20150722 - AGV
20150722 - AGV
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
20230104 - machine vision
20230104 - machine vision
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
節子、それViewControllerやない...、FatViewControllerや...。
1.
2.
📦
4.
5.
6.
8.
🤔 override func viewDidLoad()
{ super.viewDidLoad() // HUD MBProgressHUD.showAdded(to: view, animated: true) Alamofire.request("https://hogefuga.com/piyo").responseJSON { [weak self] response in guard response.error == nil else { return } guard let data = response.data else { return } guard let piyo = String(data: data, encoding: .utf8) else { return } guard let weakSelf = self else { return } // UI weakSelf.piyoLabel.text = piyo DispatchQueue.main.async { [weak self] in guard let s = self else { return } MBProgressHUD.hideAllHUDs(for: s.view, animated: true) } } }
9.
🤔 override func viewDidLoad()
{ super.viewDidLoad() metadataObjectTypesButton.isEnabled = false sessionPresetsButton.isEnabled = false cameraButton.isEnabled = false zoomSlider.isEnabled = false previewView.addGestureRecognizer(openBarcodeURLGestureRecognizer) previewView.session = session switch AVCaptureDevice.authorizationStatus(forMediaType: .video) { case .authorized: break case .notDetermined: sessionQueue.suspend() AVCaptureDevice.requestAccess(forMediaType: .video, completionHandler: { granted in if !granted { self.setupResult = .notAuthorized } self.sessionQueue.resume() }) default: setupResult = .notAuthorized } sessionQueue.async { self.configureSession() } }
10.
12.
13.
14.
16.
17.
18.
19.
20.
22.
25.
26.
🤔 override func viewDidLoad()
{ super.viewDidLoad() // HUD MBProgressHUD.showAdded(to: view, animated: true) Alamofire.request("https://hogefuga.com/piyo").responseJSON { [weak self] response in guard response.error == nil else { return } guard let data = response.data else { return } guard let piyo = String(data: data, encoding: .utf8) else { return } guard let weakSelf = self else { return } // UI weakSelf.piyoLabel.text = piyo DispatchQueue.main.async { [weak self] in guard let s = self else { return } MBProgressHUD.hideAllHUDs(for: s.view, animated: true) } } }
27.
🙆 class PiyoViewControllerImpl: UIViewController
{ var piyoPresenter: PiyoPresenter! @IBOutlet weak var piyoLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() piyoPresenter.readyForDisplay() } } extension PiyoViewControllerImpl: PiyoViewController { func showProgress() { MBProgressHUD.showAdded(to: view, animated: true) } func hideProgress() { DispatchQueue.main.async { [weak self] in guard let weakSelf = self else { return } MBProgressHUD.hideAllHUDs(for: weakSelf.view, animated: true) } } func showPiyo(piyo: String) { piyoLabel.text = piyo } }
28.
29.
protocol StatsViewController: class
{ func showProfile(_ profile: Profile) func reloadTableView() }
30.
final class StatsViewControllerImpl:
UIViewController { var statsPresenter: StatsPresenter! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() statsPresenter.readyForDisplay(byMatch: .solo, region: .asia) } } extension StatsViewControllerImpl: StatsViewController { func showProfile(_ profile: Profile) { DispatchQueue.main.async { [weak self] in guard let weakSelf = self else { return } weakSelf.nicknameLabel.text = profile.playerName } } func reloadTableView() { tableView.reloadData() } }
31.
final class StatsViewControllerImpl:
UIViewController { var statsPresenter: StatsPresenter! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() statsPresenter.readyForDisplay(byMatch: .solo, region: .asia) } } extension StatsViewControllerImpl: StatsViewController { func showProfile(_ profile: Profile) { DispatchQueue.main.async { [weak self] in guard let weakSelf = self else { return } weakSelf.nicknameLabel.text = profile.playerName } } func reloadTableView() { tableView.reloadData() } }
32.
final class StatsViewControllerImpl:
UIViewController { var statsPresenter: StatsPresenter! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() statsPresenter.readyForDisplay(byMatch: .solo, region: .asia) } } extension StatsViewControllerImpl: StatsViewController { func showProfile(_ profile: Profile) { DispatchQueue.main.async { [weak self] in guard let weakSelf = self else { return } weakSelf.nicknameLabel.text = profile.playerName } } func reloadTableView() { tableView.reloadData() } }
33.
protocol StatsPresenter: class
{ var stats: Stats! { get } func readyForDisplay(byMatsh match: Match, region: Region) }
34.
final class StatsPresenterImpl:
StatsPresenter { private let pubgTrackerDataStore = PubgTrackerDataStore() private weak var statsViewController: StatsViewController! private var nickname: String! var stats: Stats! init(statsViewController: StatsViewController, nickname: String) { self.statsViewController = statsViewController self.nickname = nickname } func readyForDisplay(byMatsh match: Match, region: Region) { pubgTrackerDataStore.fetchPubgTracker(byNickname: nickname) { [weak self] stats in guard let weakSelf = self else { return } weakSelf.stats = stats weakSelf.statsViewController.reloadTableView() weakSelf.statsViewController.showProfile(profile) } } }
35.
final class StatsPresenterImpl:
StatsPresenter { private let pubgTrackerDataStore = PubgTrackerDataStore() private weak var statsViewController: StatsViewController! private var nickname: String! var stats: Stats! init(statsViewController: StatsViewController, nickname: String) { self.statsViewController = statsViewController self.nickname = nickname } func readyForDisplay(byMatsh match: Match, region: Region) { pubgTrackerDataStore.fetchPubgTracker(byNickname: nickname) { [weak self] stats in guard let weakSelf = self else { return } weakSelf.stats = stats weakSelf.statsViewController.reloadTableView() weakSelf.statsViewController.showProfile(profile) } } }
36.
final class StatsPresenterImpl:
StatsPresenter { private let pubgTrackerDataStore = PubgTrackerDataStore() private weak var statsViewController: StatsViewController! private var nickname: String! var stats: Stats! init(statsViewController: StatsViewController, nickname: String) { self.statsViewController = statsViewController self.nickname = nickname } func readyForDisplay(byMatsh match: Match, region: Region) { pubgTrackerDataStore.fetchPubgTracker(byNickname: nickname) { [weak self] stats in guard let weakSelf = self else { return } weakSelf.stats = stats weakSelf.statsViewController.reloadTableView() weakSelf.statsViewController.showProfile(profile) } } }
37.
final class StatsViewControllerImpl:
UIViewController { var statsPresenter: StatsPresenter! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() statsPresenter.readyForDisplay(byMatch: .solo, region: .asia) } } extension StatsViewControllerImpl: StatsViewController { func showProfile(_ profile: Profile) { DispatchQueue.main.async { [weak self] in guard let weakSelf = self else { return } weakSelf.nicknameLabel.text = profile.playerName } } func reloadTableView() { tableView.reloadData() } }
38.
41.
42.
43.
46.
Jetzt herunterladen