Enviar pesquisa
Carregar
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
•
21 gostaram
•
39,278 visualizações
Kenji Tanaka
Seguir
iosオールスターズ2で登壇した内容です。
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 83
Baixar agora
Baixar para ler offline
Recomendados
Blending Culture in Twitter Client
Blending Culture in Twitter Client
Kenji Tanaka
節子、それViewControllerやない...、FatViewControllerや...。
節子、それViewControllerやない...、FatViewControllerや...。
Kenji Tanaka
描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)
Kenji Tanaka
GHC Participant Training
GHC Participant Training
AidIQ
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony application
Samuel ROZE
package org dev
package org dev
jaya lakshmi
Introduction to CQRS and Event Sourcing
Introduction to CQRS and Event Sourcing
Samuel ROZE
Chainable datasource
Chainable datasource
CocoaHeads France
Recomendados
Blending Culture in Twitter Client
Blending Culture in Twitter Client
Kenji Tanaka
節子、それViewControllerやない...、FatViewControllerや...。
節子、それViewControllerやない...、FatViewControllerや...。
Kenji Tanaka
描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)
Kenji Tanaka
GHC Participant Training
GHC Participant Training
AidIQ
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony application
Samuel ROZE
package org dev
package org dev
jaya lakshmi
Introduction to CQRS and Event Sourcing
Introduction to CQRS and Event Sourcing
Samuel ROZE
Chainable datasource
Chainable datasource
CocoaHeads France
Awesome State Management for React and Other Virtual-Dom Libraries
Awesome State Management for React and Other Virtual-Dom Libraries
FITC
Zend framework service
Zend framework service
Michelangelo van Dam
Chaincode Development 區塊鏈鏈碼開發
Chaincode Development 區塊鏈鏈碼開發
HO-HSUN LIN
Get started with YUI
Get started with YUI
Adam Lu
Introduction to Zend Framework web services
Introduction to Zend Framework web services
Michelangelo van Dam
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
Rafael Felix da Silva
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
Łukasz Chruściel
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
Rafael Felix da Silva
Workshop 5: JavaScript testing
Workshop 5: JavaScript testing
Visual Engineering
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)
GOG.com dev team
Ruby - Design patterns tdc2011
Ruby - Design patterns tdc2011
Rafael Felix da Silva
Django quickstart
Django quickstart
Marconi Moreto
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
Łukasz Chruściel
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.
Astrails
Reactive, component 그리고 angular2
Reactive, component 그리고 angular2
Jeado Ko
A short tale about state machine
A short tale about state machine
Łukasz Chruściel
Epic South Disasters
Epic South Disasters
Christopher Adams
RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017
Wanbok Choi
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Wanbok Choi
Swift Delhi: Practical POP
Swift Delhi: Practical POP
Natasha Murashev
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
Natasha Murashev
Practialpop 160510130818
Practialpop 160510130818
Shahzain Saeed
Mais conteúdo relacionado
Mais procurados
Awesome State Management for React and Other Virtual-Dom Libraries
Awesome State Management for React and Other Virtual-Dom Libraries
FITC
Zend framework service
Zend framework service
Michelangelo van Dam
Chaincode Development 區塊鏈鏈碼開發
Chaincode Development 區塊鏈鏈碼開發
HO-HSUN LIN
Get started with YUI
Get started with YUI
Adam Lu
Introduction to Zend Framework web services
Introduction to Zend Framework web services
Michelangelo van Dam
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
Rafael Felix da Silva
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
Łukasz Chruściel
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
Rafael Felix da Silva
Workshop 5: JavaScript testing
Workshop 5: JavaScript testing
Visual Engineering
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)
GOG.com dev team
Ruby - Design patterns tdc2011
Ruby - Design patterns tdc2011
Rafael Felix da Silva
Django quickstart
Django quickstart
Marconi Moreto
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
Łukasz Chruściel
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.
Astrails
Reactive, component 그리고 angular2
Reactive, component 그리고 angular2
Jeado Ko
A short tale about state machine
A short tale about state machine
Łukasz Chruściel
Epic South Disasters
Epic South Disasters
Christopher Adams
RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017
Wanbok Choi
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Wanbok Choi
Mais procurados
(19)
Awesome State Management for React and Other Virtual-Dom Libraries
Awesome State Management for React and Other Virtual-Dom Libraries
Zend framework service
Zend framework service
Chaincode Development 區塊鏈鏈碼開發
Chaincode Development 區塊鏈鏈碼開發
Get started with YUI
Get started with YUI
Introduction to Zend Framework web services
Introduction to Zend Framework web services
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
Workshop 5: JavaScript testing
Workshop 5: JavaScript testing
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)
Ruby - Design patterns tdc2011
Ruby - Design patterns tdc2011
Django quickstart
Django quickstart
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
Migrating from Flux to Redux. Why and how.
Migrating from Flux to Redux. Why and how.
Reactive, component 그리고 angular2
Reactive, component 그리고 angular2
A short tale about state machine
A short tale about state machine
Epic South Disasters
Epic South Disasters
RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Semelhante a VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
Swift Delhi: Practical POP
Swift Delhi: Practical POP
Natasha Murashev
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
描画とビジネスをクリーンに分ける Osaka 公開用
描画とビジネスをクリーンに分ける Osaka 公開用
Kenji Tanaka
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
Andrea Prearo
Optimize CollectionView Scrolling
Optimize CollectionView Scrolling
Andrea Prearo
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
DanielJalkut
View controller life cycle
View controller life cycle
SV.CO
Vue-3-Cheat-Sheet.pdf
Vue-3-Cheat-Sheet.pdf
LarsHunze1
Beautiful java script
Beautiful java script
Ürgo Ringo
RxBinding-kotlin
RxBinding-kotlin
Satoru Fujiwara
20180721 code defragment
20180721 code defragment
Chiwon Song
Does testability imply good design - Andrzej Jóźwiak - TomTom Dev Day 2022
Does testability imply good design - Andrzej Jóźwiak - TomTom Dev Day 2022
Andrzej Jóźwiak
Intro programacion funcional
Intro programacion funcional
NSCoder Mexico
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Mobivery
Building complex User Interfaces with Sitecore and React
Building complex User Interfaces with Sitecore and React
Jonne Kats
Writing Your App Swiftly
Writing Your App Swiftly
Sommer Panage
Tinkerbelles return home from their Guinness world-record attempt on Sunday
Tinkerbelles return home from their Guinness world-record attempt on Sunday
chicagonewsyesterday
NongBeer MVP Demo application
NongBeer MVP Demo application
The Khaeng Doungsodsri
Semelhante a VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
(20)
Swift Delhi: Practical POP
Swift Delhi: Practical POP
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
描画とビジネスをクリーンに分ける Osaka 公開用
描画とビジネスをクリーンに分ける Osaka 公開用
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
Optimize CollectionView Scrolling
Optimize CollectionView Scrolling
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
View controller life cycle
View controller life cycle
Vue-3-Cheat-Sheet.pdf
Vue-3-Cheat-Sheet.pdf
Beautiful java script
Beautiful java script
RxBinding-kotlin
RxBinding-kotlin
20180721 code defragment
20180721 code defragment
Does testability imply good design - Andrzej Jóźwiak - TomTom Dev Day 2022
Does testability imply good design - Andrzej Jóźwiak - TomTom Dev Day 2022
Intro programacion funcional
Intro programacion funcional
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Building complex User Interfaces with Sitecore and React
Building complex User Interfaces with Sitecore and React
Writing Your App Swiftly
Writing Your App Swiftly
Tinkerbelles return home from their Guinness world-record attempt on Sunday
Tinkerbelles return home from their Guinness world-record attempt on Sunday
NongBeer MVP Demo application
NongBeer MVP Demo application
Mais de 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
Mais de 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からのアプリ間ファイル共有_公開用
Último
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
The Digital Insurer
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
hans926745
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
Martijn de Jong
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
sudhanshuwaghmare1
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Drew Madelung
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
Antenna Manufacturer Coco
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Katpro Technologies
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
naman860154
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Malak Abu Hammad
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
debabhi2
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
Delhi Call girls
🐬 The future of MySQL is Postgres 🐘
🐬 The future of MySQL is Postgres 🐘
RTylerCroy
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
Results
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
Principled Technologies
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
The Digital Insurer
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
Gabriella Davis
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
apidays
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Enterprise Knowledge
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
Último
(20)
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
🐬 The future of MySQL is Postgres 🐘
🐬 The future of MySQL is Postgres 🐘
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
1.
2.
📦
3.
4.
5.
6.
7.
8.
9.
10.
11.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } }
12.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } }
13.
14.
15.
16.
👃
17.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } }
18.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } }
19.
💢😡
20.
21.
☺
22.
23.
24.
25.
26.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) self?.showAdViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } }
27.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in if isSucceed { self?.isLogined = true TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) self?.showAdViewIfNeeded(timeline) } } else { self?.isLogined = false } self?.showLoginViewIfNeeded() } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } private func showLoginViewIfNeeded() { if isLogined { loginView.isHidden = true } else { loginView.isHidden = false } } }
28.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } private func showLoginViewIfNeeded() { if isLogined { loginView.isHidden = true } else { loginView.isHidden = false } } private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() } }
29.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } private func showLoginViewIfNeeded() { if isLogined { loginView.isHidden = true } else { loginView.isHidden = false } } private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } }
30.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } private func showLoginViewIfNeeded() { if isLogined { loginView.isHidden = true } else { loginView.isHidden = false } } private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! @IBOutlet weak var loginView: LoginView! private var isLogined = false override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } override func viewDidLoad() { super.viewDidLoad() LoginManager.login() { [weak self] isSucceed in guard let `self` = self else { return } if isSucceed { TwitterManager.getTimeline() { [weak self] timeline in guard let `self` = self else { return } self.timeline = timeline self.showEmptyViewIfNeeded(timeline) self.showAdViewIfNeeded(timeline) self.showLoginViewIfNeeded() } } } } }
31.
32.
33.
34.
35.
💡
36.
37.
38.
39.
40.
41.
42.
😄
43.
44.
🙌
45.
🤔
46.
😡👊💢
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
protocol TimelineTableVCOutput: class
{ func showEmptyView() func hideEmptyView() func showTimeline(timeline: Timeline) }
57.
class TimelineTableViewController: UITableViewController
{ @IBOutlet weak var emptyView: UIView! // Presenter private var timelinePresenter: TimelinePresenter! fileprivate var timeline: Timeline? = nil { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Presenter timelinePresenter = TimelinePresenter(output: self) } @IBAction func tapGetTimelineButton(_ sender: Any) { // Presenter timelinePresenter?.getTimeline() } }
58.
class TimelineTableViewController: UITableViewController
{ @IBOutlet weak var emptyView: UIView! // Presenter private var timelinePresenter: TimelinePresenter! fileprivate var timeline: Timeline? = nil { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Presenter timelinePresenter = TimelinePresenter(output: self) } @IBAction func tapGetTimelineButton(_ sender: Any) { // Presenter timelinePresenter?.getTimeline() } }
59.
class TimelineTableViewController: UITableViewController
{ @IBOutlet weak var emptyView: UIView! // Presenter private var timelinePresenter: TimelinePresenter! fileprivate var timeline: Timeline? = nil { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Presenter timelinePresenter = TimelinePresenter(output: self) } @IBAction func tapGetTimelineButton(_ sender: Any) { // Presenter timelinePresenter?.getTimeline() } }
60.
extension TimelineViewController: TimelineTableVCOutput
{ func showEmptyView() { emptyView.isHidden = false } func hideEmptyView() { emptyView.isHidden = true } func showTimeline(timeline: Timeline) { self.timeline = timeline } }
61.
class TimelinePresenter { private
weak var timelineTableVCOutput: TimelineTableVCOutput! private var timelineUseCase = TimelineUseCase() init(output timelineTableVCOutput: TimelineTableVCOutput) { self.timelineTableVCOutput = timelineTableVCOutput } func getTimeline() { timelineUseCase.getTimeline() { [weak self] result in switch result { case .failure: self?.timelineViewControllerDelegate.showEmptyView() case .success(let timeline): self?.timelineViewControllerDelegate.hideEmptyView() self?.timelineViewControllerDelegate.showTimeline(timeline: timeline) } } } }
62.
class TimelinePresenter { private
weak var timelineTableVCOutput: TimelineTableVCOutput! private var timelineUseCase = TimelineUseCase() init(output timelineTableVCOutput: TimelineTableVCOutput) { self.timelineTableVCOutput = timelineTableVCOutput } func getTimeline() { timelineUseCase.getTimeline() { [weak self] result in switch result { case .failure: self?.timelineTableVCOutput.showEmptyView() case .success(let timeline): self?.timelineTableVCOutput.hideEmptyView() self?.timelineTableVCOutput.showTimeline(timeline: timeline) } } } }
63.
64.
protocol TimelineTableVCOutput: class
{ func showEmptyView() func hideEmptyView() func showAdView() func hideAdView() func showTimeline(timeline: Timeline) }
65.
class TimelineTableViewController: UITableViewController
{ @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! // Presenter private var timelinePresenter: TimelinePresenter! fileprivate var timeline: Timeline? = nil { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Presenter timelinePresenter = TimelinePresenter(output: self) } @IBAction func tapGetTimelineButton(_ sender: Any) { // Presenter timelinePresenter?.getTimeline() } }
66.
extension TimelineTableViewController: TimelineTableVCOutput
{ func showEmptyView() { emptyView.isHidden = false } func hideEmptyView() { emptyView.isHidden = true } func showAdView() { adView.isHidden = false } func hideAdView() { adView.isHidden = true } func showTimeline(timeline: Timeline) { self.timeline = timeline } }
67.
class TimelinePresenter { private
weak var timelineTableVCOutput: TimelineTableVCOutput! private var timelineUseCase = TimelineUseCase() init(output timelineTableVCOutput: TimelineTableVCOutput) { self.timelineTableVCOutput = timelineTableVCOutput } func getTimeline() { timelineUseCase.getTimeline() { [weak self] result in switch result { case .failure: self?.timelineTableVCOutput.showEmptyView() self?.timelineTableVCOutput.hideAdView() case .success(let timeline): self?.timelineTableVCOutput.hideEmptyView() self?.timelineTableVCOutput.showTimeline(timeline: timeline) self?.showAdViewIfNeeded(timeline: timeline) } } } private func showAdViewIfNeeded(timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { timelineTableVCOutput.showAdView() } else { timelineTableVCOutput.hideAdView() } } }
68.
69.
class TimelineTableViewController: UITableViewController
{ private var timeline: Timeline? = nil { didSet { tableView.reloadData() } } @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! override func viewDidLoad() { super.viewDidLoad() TwitterManager.getTimeline() { [weak self] timeline in self?.timeline = timeline self?.showEmptyViewIfNeeded(timeline) self?.showAdViewIfNeeded(timeline) } } private func showEmptyViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems == 0 { emptyView.isHidden = false } else { emptyView.isHidden = true } } private func showAdViewIfNeeded(_ timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { adView.isHidden = false } else { adView.isHidden = true } } }
70.
class TimelineTableViewController: UITableViewController
{ @IBOutlet weak var emptyView: UIView! @IBOutlet weak var adView: AdView! // Presenter private var timelinePresenter: TimelinePresenter! fileprivate var timeline: Timeline? = nil { didSet { tableView.reloadData() } } override func viewDidLoad() { super.viewDidLoad() // Presenter timelinePresenter = TimelinePresenter(output: self) } @IBAction func tapGetTimelineButton(_ sender: Any) { // Presenter timelinePresenter?.getTimeline() } }
71.
extension TimelineTableViewController: TimelineTableVCOutput
{ func showEmptyView() { emptyView.isHidden = false } func hideEmptyView() { emptyView.isHidden = true } func showAdView() { adView.isHidden = false } func hideAdView() { adView.isHidden = true } func showTimeline(timeline: Timeline) { self.timeline = timeline } }
72.
class TimelinePresenter { private
weak var timelineTableVCOutput: TimelineTableVCOutput! private var timelineUseCase = TimelineUseCase() init(output timelineTableVCOutput: TimelineTableVCOutput) { self.timelineTableVCOutput = timelineTableVCOutput } func getTimeline() { timelineUseCase.getTimeline() { [weak self] result in switch result { case .failure: self?.timelineTableVCOutput.showEmptyView() self?.timelineTableVCOutput.hideAdView() case .success(let timeline): self?.timelineTableVCOutput.hideEmptyView() self?.timelineTableVCOutput.showTimeline(timeline: timeline) self?.showAdViewIfNeeded(timeline: timeline) } } } private func showAdViewIfNeeded(timeline: Timeline) { if timeline?.numberOfItems >= 1 && timeline?.numberOfItems <= 3 { timelineTableVCOutput.showAdView() } else { timelineTableVCOutput.hideAdView() } } }
73.
74.
👋
75.
76.
77.
78.
79.
80.
Baixar agora