SlideShare a Scribd company logo
1 of 29
Download to read offline
Filiale privée de la SNCF
+ de 1100 collaborateurs
35 équipes de développement
Paris, Lille, Nantes
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Voyages-Sncf.com
Sites et applications mobiles
Logiciel, middleware, moteur d’itinéraire
Digital Factory de la SNCF
- sncf.com
- application SNCF
- TGVPro, IDTGV,
- …
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
VSC Technologies
Gwenn Guihal, 32 ans
- 2008-2013 : Développeur Flash
- depuis 2013: Développeur iOS
@_myrddin_
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
14M de téléchargements
30% de l’audience
10 millions de visites/mois
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
V.
6 devs iOS
6 devs android
2 dev back
1 architecte
ui/ux
4 product owners
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
V.
~100 écrans
ios8
swift (~35%)
iPhone, iPad, Apple watch, widget
release tous les 2/3 mois
version #32 en production
depuis 2009
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
V.
2009 ?
😱
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Grossissement de l’équipe
Refonte technique
Refonte UI
Refontes intégrées dans le delivery
TU
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Sortir du Legacy
AFNetworking
CocoaPods
Repository privé
Fastlane (intégration continue)
Swift
CollectionView
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Quelques étapes
CollectionView
😍
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Layout personnalisé
DecorationView
Animations
iPad
Réutilisation des cellules
UICollectionViewFlowLayout
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
versus TableView
Micro-architecture
😶
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
UICollectionViewCell
(affiche ce que lui done l’adapter)
Adapter
(transforme, formate le
model)
Model
(contient les données)
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
class VSTransactionCardCollectionViewCell: UICollectionViewCell, VSCollectionCellProtocol {
@IBOutlet weak var label: UILabel!
func updateWithAdapter(adapter aAdapter: VSCollectionAdapter) -> Void {
guard let adapter = aAdapter as? VSTransactionCardAdapter else {
fatalError("VSTransactionCardAdapter required")
}
label.attributedText = adapter.label
}
}
Cellule
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
struct VSTransactionCardAdapter: VSCollectionAdapter {
let label:NSAttributedString
init(order:Order) {
let creditCardNumber = order.creditCardNumber()
let sentence = String(format: trans(message_credit_card), creditCardNumber)
label = NSAttributedString(string: sentence, attributes: [
NSFontAttributeName: UIFont.systemFontOfSize(14, weightFont:.Bold),
NSForegroundColorAttributeName: UIColor.blackColor()
])
}
func labelHeight(forWidth: CGFloat) -> CGFloat {
let size = label.boundingRectWithSize(CGSize(width: forWidth, height: CGFloat.max),
options: […],
context: nil)
return ceil(size.height)
}
}
Adapter
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
class VSLabelCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var label: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// ...
}
static func computeHeight(forWidth:CGFloat, text:NSAttributedString) -> CGFloat {
//...
}
}
Cellule Legacy
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
class VSLabelCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var label: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// ...
}
static func computeHeight(forWidth:CGFloat, text:NSAttributedString) -> CGFloat {
//...
}
}
extension VSLabelCollectionViewCell : VSCollectionCellProtocol {
func updateWithAdapter(adapter aAdapter: VSCollectionAdapter) -> Void {
guard let adapter = aAdapter as? VSCollectionLabelAdapter else {
fatalError("VSCollectionLabelAdapter required")
}
label.attributedText = adapter.label
}
}
protocol VSCollectionLabelAdapter {
var label:NSAttributedString! {get}
}
Extension 😅
cellForItemAtIndexPath…
numberOfItemsInSection…
shouldSelectItemAtIndexPath…
sizeForItemAtIndexPath…
insetForSectionAtIndex…
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Delegate et Datasource
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Adapter
(transforme, formate le
model)
CellDescriptor
(représente la cellule pour le
delegate et datasource)
SectionDescriptor
(contient un tableau de
cellDescriptors)
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
class VSCardSectionDescriptor: VSCollectionSectionDescriptor {
var cells = [VSCollectionCellDescriptor]()
var backgroundColor : UIColor? = nil
let backgroundPadding = UIEdgeInsetsZero
var isExpanded: Bool = false
func sectionInset(collectionView:UICollectionView) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 15 + ipadInsetX(), bottom: 10, right: 15 + ipadInsetX())
}
}
SectionDescriptor
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
struct VSTransactionCardDescriptor: VSCollectionCellDescriptor {
let identifier: String = "VSLabelCollectionViewCell"
let className: String = "VSLabelCollectionViewCell"
var selectable:Bool = false
var adapter: VSCollectionAdapter {
return _adapter
}
let _adapter: VSTransactionCardAdapter
init(order:Order) {
_adapter = VSTransactionCardAdapter(order:order)
}
func size(collectionView: UICollectionView, sectionDescriptor: VSCollectionSectionDescriptor) ->
CGSize {
let sectionInset = sectionDescriptor.sectionInset(collectionView)
let width:CGFloat = collectionView.bounds.width - sectionInset.left - sectionInset.right
return CGSize(width: width, height: max(_adapter.labelHeight(width), 24))
}
}
CellDescriptor
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
class VSCollectionDataSource: NSObject, UICollectionViewDataSource {
var collectionDatas: VSCollectionDatas?
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return collectionDatas?.sectionsCount() ?? 0
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return collectionDatas?.sections[section].cells.count ?? 0
}
func collectionView(UICollectionView, cellForItemAtIndexPath NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellDescriptor.identifier,
forIndexPath: indexPath) as VSCollectionCellProtocol
cell.updateWithAdapter(adapter: cellDescriptor.adapter)
return cell
}
func collectionView( UICollectionView, layout UICollectionViewLayout, sizeForItemAtIndexPath :
NSIndexPath) -> CGSize {
if let sectionDescriptor = collectionDatas?.sections[indexPath.section] {
let cellDescriptor = sectionDescriptor.cells[indexPath.item]
return cellDescriptor.size(collectionView, sectionDescriptor: sectionDescriptor)
}
return CGSizeZero
}
UICollectionViewDataSource
Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
Merci,
🤔

More Related Content

Viewers also liked

杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014 杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
Maki Sugimoto
 
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
Computational Materials Science Initiative
 

Viewers also liked (18)

今のうちに知っておきたい Swiftの高速化 + 3D Touch API
今のうちに知っておきたい Swiftの高速化 + 3D Touch API今のうちに知っておきたい Swiftの高速化 + 3D Touch API
今のうちに知っておきたい Swiftの高速化 + 3D Touch API
 
アクセシブルなモーダルダイアログの作り方 #scripty05
アクセシブルなモーダルダイアログの作り方 #scripty05アクセシブルなモーダルダイアログの作り方 #scripty05
アクセシブルなモーダルダイアログの作り方 #scripty05
 
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014 杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
 
SQuBOK読破会活動紹介とSQuBOKにおける派生開発
SQuBOK読破会活動紹介とSQuBOKにおける派生開発SQuBOK読破会活動紹介とSQuBOKにおける派生開発
SQuBOK読破会活動紹介とSQuBOKにおける派生開発
 
AVX命令を用いたLJの力計算のSIMD化
AVX命令を用いたLJの力計算のSIMD化AVX命令を用いたLJの力計算のSIMD化
AVX命令を用いたLJの力計算のSIMD化
 
SWEBOKにみるソフトウェアエンジニアリングの全体、および、 つながる時代のソフトウェアモデリング&品質
SWEBOKにみるソフトウェアエンジニアリングの全体、および、 つながる時代のソフトウェアモデリング&品質 SWEBOKにみるソフトウェアエンジニアリングの全体、および、 つながる時代のソフトウェアモデリング&品質
SWEBOKにみるソフトウェアエンジニアリングの全体、および、 つながる時代のソフトウェアモデリング&品質
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
 
M2M/IoTとは何か? 「モノのインターネット」で変貌する世界の今と未来
M2M/IoTとは何か? 「モノのインターネット」で変貌する世界の今と未来 M2M/IoTとは何か? 「モノのインターネット」で変貌する世界の今と未来
M2M/IoTとは何か? 「モノのインターネット」で変貌する世界の今と未来
 
Adobe Illustrator はじめてのスクリプト
Adobe Illustrator はじめてのスクリプトAdobe Illustrator はじめてのスクリプト
Adobe Illustrator はじめてのスクリプト
 
Ajax basic
Ajax basicAjax basic
Ajax basic
 
Swift Code in Swift - 2日間でゲームを作ってみた
Swift Code in Swift - 2日間でゲームを作ってみたSwift Code in Swift - 2日間でゲームを作ってみた
Swift Code in Swift - 2日間でゲームを作ってみた
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみたGMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
 
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
CMSI計算科学技術特論A(6) 線形代数演算ライブラリBLASとLAPACKの基礎と実践1
 
大阪市南港ATC イメディオ IoT・ M2Mセミナ資料(web公開用)
大阪市南港ATC イメディオ IoT・ M2Mセミナ資料(web公開用)大阪市南港ATC イメディオ IoT・ M2Mセミナ資料(web公開用)
大阪市南港ATC イメディオ IoT・ M2Mセミナ資料(web公開用)
 
人工知能をビジネスに活かす
人工知能をビジネスに活かす人工知能をビジネスに活かす
人工知能をビジネスに活かす
 
GUI自動テストの保守性を高めるには
GUI自動テストの保守性を高めるにはGUI自動テストの保守性を高めるには
GUI自動テストの保守性を高めるには
 

Similar to Voyages-sncf.com : Choix techniques et évolutions de l'application mobile

ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
Ontico
 

Similar to Voyages-sncf.com : Choix techniques et évolutions de l'application mobile (16)

Advanced functional programing in Swift
Advanced functional programing in SwiftAdvanced functional programing in Swift
Advanced functional programing in Swift
 
Grails EE
Grails EEGrails EE
Grails EE
 
ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
ApplicationCoordinator для навигации между экранами / Павел Гуров (Avito)
 
The Ring programming language version 1.9 book - Part 14 of 210
The Ring programming language version 1.9 book - Part 14 of 210The Ring programming language version 1.9 book - Part 14 of 210
The Ring programming language version 1.9 book - Part 14 of 210
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG Firenze
 
Alerts notification
Alerts notificationAlerts notification
Alerts notification
 
The Ring programming language version 1.8 book - Part 12 of 202
The Ring programming language version 1.8 book - Part 12 of 202The Ring programming language version 1.8 book - Part 12 of 202
The Ring programming language version 1.8 book - Part 12 of 202
 
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
 
Lab Practices and Works Documentation / Report on Computer Graphics
Lab Practices and Works Documentation / Report on Computer GraphicsLab Practices and Works Documentation / Report on Computer Graphics
Lab Practices and Works Documentation / Report on Computer Graphics
 
Anais Dotis-Georgiou & Faith Chikwekwe [InfluxData] | Top 10 Hurdles for Flux...
Anais Dotis-Georgiou & Faith Chikwekwe [InfluxData] | Top 10 Hurdles for Flux...Anais Dotis-Georgiou & Faith Chikwekwe [InfluxData] | Top 10 Hurdles for Flux...
Anais Dotis-Georgiou & Faith Chikwekwe [InfluxData] | Top 10 Hurdles for Flux...
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
Developer Journey at Zalando - Idea to Production with Containers in the Clou...
Developer Journey at Zalando - Idea to Production with Containers in the Clou...Developer Journey at Zalando - Idea to Production with Containers in the Clou...
Developer Journey at Zalando - Idea to Production with Containers in the Clou...
 
20180721 code defragment
20180721 code defragment20180721 code defragment
20180721 code defragment
 
Geospatial Graphs made easy with OrientDB - Codemotion Spain
Geospatial Graphs made easy with OrientDB - Codemotion SpainGeospatial Graphs made easy with OrientDB - Codemotion Spain
Geospatial Graphs made easy with OrientDB - Codemotion Spain
 
Java Applet and Graphics
Java Applet and GraphicsJava Applet and Graphics
Java Applet and Graphics
 
Java Applet and Graphics
Java Applet and GraphicsJava Applet and Graphics
Java Applet and Graphics
 

Recently uploaded

Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoorTop Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
dharasingh5698
 

Recently uploaded (20)

Intro To Electric Vehicles PDF Notes.pdf
Intro To Electric Vehicles PDF Notes.pdfIntro To Electric Vehicles PDF Notes.pdf
Intro To Electric Vehicles PDF Notes.pdf
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptx
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
chapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringchapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineering
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.ppt
 
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoorTop Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
 
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank  Design by Working Stress - IS Method.pdfIntze Overhead Water Tank  Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
 
NFPA 5000 2024 standard .
NFPA 5000 2024 standard                                  .NFPA 5000 2024 standard                                  .
NFPA 5000 2024 standard .
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 

Voyages-sncf.com : Choix techniques et évolutions de l'application mobile

  • 1.
  • 2. Filiale privée de la SNCF + de 1100 collaborateurs 35 équipes de développement Paris, Lille, Nantes Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 Voyages-Sncf.com
  • 3. Sites et applications mobiles Logiciel, middleware, moteur d’itinéraire Digital Factory de la SNCF - sncf.com - application SNCF - TGVPro, IDTGV, - … Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 VSC Technologies
  • 4. Gwenn Guihal, 32 ans - 2008-2013 : Développeur Flash - depuis 2013: Développeur iOS @_myrddin_ Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
  • 5. 14M de téléchargements 30% de l’audience 10 millions de visites/mois Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 V.
  • 6. 6 devs iOS 6 devs android 2 dev back 1 architecte ui/ux 4 product owners Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 V.
  • 7. ~100 écrans ios8 swift (~35%) iPhone, iPad, Apple watch, widget release tous les 2/3 mois version #32 en production depuis 2009 Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 V.
  • 8. 2009 ? 😱 Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
  • 9.
  • 10.
  • 11. Grossissement de l’équipe Refonte technique Refonte UI Refontes intégrées dans le delivery TU Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 Sortir du Legacy
  • 12. AFNetworking CocoaPods Repository privé Fastlane (intégration continue) Swift CollectionView Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 Quelques étapes
  • 13.
  • 14.
  • 15. CollectionView 😍 Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
  • 16. Layout personnalisé DecorationView Animations iPad Réutilisation des cellules UICollectionViewFlowLayout Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 versus TableView
  • 17.
  • 18. Micro-architecture 😶 Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016
  • 19. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 UICollectionViewCell (affiche ce que lui done l’adapter) Adapter (transforme, formate le model) Model (contient les données)
  • 20. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 class VSTransactionCardCollectionViewCell: UICollectionViewCell, VSCollectionCellProtocol { @IBOutlet weak var label: UILabel! func updateWithAdapter(adapter aAdapter: VSCollectionAdapter) -> Void { guard let adapter = aAdapter as? VSTransactionCardAdapter else { fatalError("VSTransactionCardAdapter required") } label.attributedText = adapter.label } } Cellule
  • 21. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 struct VSTransactionCardAdapter: VSCollectionAdapter { let label:NSAttributedString init(order:Order) { let creditCardNumber = order.creditCardNumber() let sentence = String(format: trans(message_credit_card), creditCardNumber) label = NSAttributedString(string: sentence, attributes: [ NSFontAttributeName: UIFont.systemFontOfSize(14, weightFont:.Bold), NSForegroundColorAttributeName: UIColor.blackColor() ]) } func labelHeight(forWidth: CGFloat) -> CGFloat { let size = label.boundingRectWithSize(CGSize(width: forWidth, height: CGFloat.max), options: […], context: nil) return ceil(size.height) } } Adapter
  • 22. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 class VSLabelCollectionViewCell: UICollectionViewCell { @IBOutlet weak var label: UILabel! override func awakeFromNib() { super.awakeFromNib() // ... } static func computeHeight(forWidth:CGFloat, text:NSAttributedString) -> CGFloat { //... } } Cellule Legacy
  • 23. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 class VSLabelCollectionViewCell: UICollectionViewCell { @IBOutlet weak var label: UILabel! override func awakeFromNib() { super.awakeFromNib() // ... } static func computeHeight(forWidth:CGFloat, text:NSAttributedString) -> CGFloat { //... } } extension VSLabelCollectionViewCell : VSCollectionCellProtocol { func updateWithAdapter(adapter aAdapter: VSCollectionAdapter) -> Void { guard let adapter = aAdapter as? VSCollectionLabelAdapter else { fatalError("VSCollectionLabelAdapter required") } label.attributedText = adapter.label } } protocol VSCollectionLabelAdapter { var label:NSAttributedString! {get} } Extension 😅
  • 25. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 Adapter (transforme, formate le model) CellDescriptor (représente la cellule pour le delegate et datasource) SectionDescriptor (contient un tableau de cellDescriptors)
  • 26. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 class VSCardSectionDescriptor: VSCollectionSectionDescriptor { var cells = [VSCollectionCellDescriptor]() var backgroundColor : UIColor? = nil let backgroundPadding = UIEdgeInsetsZero var isExpanded: Bool = false func sectionInset(collectionView:UICollectionView) -> UIEdgeInsets { return UIEdgeInsets(top: 0, left: 15 + ipadInsetX(), bottom: 10, right: 15 + ipadInsetX()) } } SectionDescriptor
  • 27. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 struct VSTransactionCardDescriptor: VSCollectionCellDescriptor { let identifier: String = "VSLabelCollectionViewCell" let className: String = "VSLabelCollectionViewCell" var selectable:Bool = false var adapter: VSCollectionAdapter { return _adapter } let _adapter: VSTransactionCardAdapter init(order:Order) { _adapter = VSTransactionCardAdapter(order:order) } func size(collectionView: UICollectionView, sectionDescriptor: VSCollectionSectionDescriptor) -> CGSize { let sectionInset = sectionDescriptor.sectionInset(collectionView) let width:CGFloat = collectionView.bounds.width - sectionInset.left - sectionInset.right return CGSize(width: width, height: max(_adapter.labelHeight(width), 24)) } } CellDescriptor
  • 28. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 class VSCollectionDataSource: NSObject, UICollectionViewDataSource { var collectionDatas: VSCollectionDatas? func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return collectionDatas?.sectionsCount() ?? 0 } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return collectionDatas?.sections[section].cells.count ?? 0 } func collectionView(UICollectionView, cellForItemAtIndexPath NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellDescriptor.identifier, forIndexPath: indexPath) as VSCollectionCellProtocol cell.updateWithAdapter(adapter: cellDescriptor.adapter) return cell } func collectionView( UICollectionView, layout UICollectionViewLayout, sizeForItemAtIndexPath : NSIndexPath) -> CGSize { if let sectionDescriptor = collectionDatas?.sections[indexPath.section] { let cellDescriptor = sectionDescriptor.cells[indexPath.item] return cellDescriptor.size(collectionView, sectionDescriptor: sectionDescriptor) } return CGSizeZero } UICollectionViewDataSource
  • 29. Gwenn Guihal - @_myrrdin_ - 19 Octobre 2016 Merci, 🤔