SlideShare a Scribd company logo
1 of 58
Download to read offline
The Combine triad
The Combine triad
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let sub = publisher.sink(receiveCompletion: { completionEvent in
print("The request finished with result: (completionEvent)")
}, receiveValue: { result in
print("Received result: (result)")
})
- Returns: A cancellable instance; used when you end assignment of the received value.
Deallocation of the result will tear down the subscription stream.
publisher.sink(receiveCompletion:receiveValue:)
Your code
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Obtain valuesRequest values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Obtain values
Send values
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Send completion
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Send completionReceive completion
Request values from subscription
Publishers
• Create subscriptions

• Link subscriptions to subscribers
Subscriptions
• Obtain values by generating them or receiving them.

• Relay obtained values to subscribers (if demand is high enough)
extension Publisher {
func dw_sink(receiveCompletion:
@escaping (Subscribers.Completion<Self.Failure>) -> Void,
receiveValue:
@escaping (Self.Output) -> Void) -> AnyCancellable {
}
}
dw_sink()
extension Publisher {
func dw_sink(receiveCompletion:
@escaping (Subscribers.Completion<Self.Failure>) -> Void,
receiveValue:
@escaping (Self.Output) -> Void) -> AnyCancellable {
let subscriber = DWSink(receiveValue: receiveValue,
receiveCompletion: receiveCompletion)
}
}
dw_sink()
extension Publisher {
func dw_sink(receiveCompletion:
@escaping (Subscribers.Completion<Self.Failure>) -> Void,
receiveValue:
@escaping (Self.Output) -> Void) -> AnyCancellable {
let subscriber = DWSink(receiveValue: receiveValue,
receiveCompletion: receiveCompletion)
self.subscribe(subscriber)
}
}
dw_sink()
extension Publisher {
func dw_sink(receiveCompletion:
@escaping (Subscribers.Completion<Self.Failure>) -> Void,
receiveValue:
@escaping (Self.Output) -> Void) -> AnyCancellable {
let subscriber = DWSink(receiveValue: receiveValue,
receiveCompletion: receiveCompletion)
self.subscribe(subscriber)
return AnyCancellable(subscriber)
}
}
dw_sink()
public protocol Subscriber : CustomCombineIdentifierConvertible {
associatedtype Input
associatedtype Failure : Error
func receive(subscription: Subscription)
func receive(_ input: Self.Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Self.Failure>)
}
class DWSink<Input, Failure: Error>: Subscriber, Cancellable {
let receiveValue: (Input) -> Void
let receiveCompletion: (Subscribers.Completion<Failure>) -> Void
func receive(subscription: Subscription) {
// todo: implement
}
func receive(_ input: Input) -> Subscribers.Demand {
// todo: implement
}
func receive(completion: Subscribers.Completion<Failure>) {
// todo: implement
}
func cancel() {
// todo: implement
}
}
var subscription: Subscription?
func receive(subscription: Subscription) {
subscription.request(.unlimited)
self.subscription = subscription
}
DWSink.receive(subscription:)
var subscription: Subscription?
func receive(subscription: Subscription) {
subscription.request(.unlimited)
self.subscription = subscription
}
DWSink.receive(subscription:)
.max(value:) .none
func receive(_ input: Input) -> Subscribers.Demand {
receiveValue(input)
return .none
}
DWSink.receive(_:)
receive(subscription:)
Request: .max(1)
Total demand: 1
receive(subscription:)
Request: .max(1)
Total demand: 1
receive(_:)
Return: .max(5)
Total demand: 6
receive(subscription:)
Request: .max(1)
Total demand: 1
receive(_:)
Return: .max(5)
Total demand: 6
receive(_:)
Return: .none
Total demand: 6
func receive(completion: Subscribers.Completion<Failure>) {
receiveCompletion(completion)
}
DWSink.receive(completion:)
func cancel() {
subscription = nil
}
DWSink.cancel()
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Send completionReceive completion
Request values from subscription
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let cancellable = publisher.dw_sink(receiveCompletion: { completion in
print("Custom chain completed: (completion)")
}, receiveValue: { result in
print("Custom chain got result: (result)")
})
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let cancellable = publisher.dw_sink(receiveCompletion: { completion in
print("Custom chain completed: (completion)")
}, receiveValue: { result in
print("Custom chain got result: (result)")
})
âš 
public protocol Publisher {
associatedtype Output
associatedtype Failure : Error
func receive<S>(subscriber: S)
where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}
struct DWDataTaskPublisher: Publisher {
typealias Failure = URLError
typealias Output = (data: Data, response: URLResponse)
let request: URLRequest
func receive<S: Subscriber>(subscriber: S)
where Failure == S.Failure, Output == S.Input {
}
}
struct DWDataTaskPublisher: Publisher {
typealias Failure = URLError
typealias Output = (data: Data, response: URLResponse)
let request: URLRequest
func receive<S: Subscriber>(subscriber: S)
where Failure == S.Failure, Output == S.Input {
let subscription = DWDataTaskSubscription<S>(request: request,
subscriber: subscriber)
}
}
struct DWDataTaskPublisher: Publisher {
typealias Failure = URLError
typealias Output = (data: Data, response: URLResponse)
let request: URLRequest
func receive<S: Subscriber>(subscriber: S)
where Failure == S.Failure, Output == S.Input {
let subscription = DWDataTaskSubscription<S>(request: request,
subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}
public protocol Subscription : Cancellable, CustomCombineIdentifierConvertible {
func request(_ demand: Subscribers.Demand)
}
class DWDataTaskSubscription<S: Subscriber>: Subscription
where S.Failure == URLError,
S.Input == (data: Data, response: URLResponse) {
var subscriber: S?
let request: URLRequest
func request(_ demand: Subscribers.Demand) {
// todo: implement
}
func cancel() {
subscriber = nil
}
}
func request(_ demand: Subscribers.Demand) {
guard demand > 0 else { return }
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error as? URLError {
self.subscriber?.receive(completion: .failure(error))
} else if let data = data, let response = response {
self.subscriber?.receive((data, response))
self.subscriber?.receive(completion: .finished)
}
self.cancel()
// if we don't have an error AND no data, we should maybe do something.
// but we'll ignore it for now.
}.resume()
}
func request(_ demand: Subscribers.Demand) {
guard demand > 0 else { return }
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error as? URLError {
self.subscriber?.receive(completion: .failure(error))
} else if let data = data, let response = response {
self.subscriber?.receive((data, response))
self.subscriber?.receive(completion: .finished)
}
self.cancel()
// if we don't have an error AND no data, we should maybe do something.
// but we'll ignore it for now.
}.resume()
}
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let cancellable = publisher.dw_sink(receiveCompletion: { completion in
print("Custom chain completed: (completion)")
}, receiveValue: { result in
print("Custom chain got result: (result)")
})
let publisher = URLSession.shared.dataTaskPublisher(for: someURLRequest)
let cancellable = publisher.dw_sink(receiveCompletion: { completion in
print("Custom chain completed: (completion)")
}, receiveValue: { result in
print("Custom chain got result: (result)")
})
let publisher = DWDataTaskPublisher(request: someURLRequest)
publisher.sink(receiveCompletion:receiveValue:)
Your code
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Obtain valuesRequest values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Obtain values
Send values
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Send completion
Request values from subscription
publisher.sink(receiveCompletion:receiveValue:)
Your code
Sink
A Subscriber is created Publisher.subscribe(_:)
Publisher
A Subscription is created subscriber.receive(subscription)
Subscriber Subscription
Receive values and request more values
Obtain values
Send values
Send completionReceive completion
Request values from subscription
Some tips and advise
• I mentioned it a couple of times but Apple does not recommend that you
implement custom publishers and subscriptions

• That said, it’s good to explore and see how things work.

• Retain your AnyCancellable because a in correct implementation,
Subscription will cancel as soon as the AnyCancellable is released
Thank you

More Related Content

Similar to The combine triad

Jasigsakai12 columbia-customizes-cas
Jasigsakai12 columbia-customizes-casJasigsakai12 columbia-customizes-cas
Jasigsakai12 columbia-customizes-casellentuck
 
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar OnlineNatan Silnitsky
 
$q and Promises in AngularJS
$q and Promises in AngularJS $q and Promises in AngularJS
$q and Promises in AngularJS a_sharif
 
TCPIP Client Server program exampleHere is a simple example of .pdf
TCPIP Client Server program exampleHere is a simple example of .pdfTCPIP Client Server program exampleHere is a simple example of .pdf
TCPIP Client Server program exampleHere is a simple example of .pdfallisontraders
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015Constantine Mars
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsYakov Fain
 
Server Side Swift with Swag
Server Side Swift with SwagServer Side Swift with Swag
Server Side Swift with SwagJens Ravens
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
Protocol-Oriented Networking
Protocol-Oriented NetworkingProtocol-Oriented Networking
Protocol-Oriented NetworkingMostafa Amer
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionLINE Corporation
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJSSandi Barr
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsMichael Peacock
 
Managing State in React Apps with RxJS by James Wright at FrontCon 2019
Managing State in React Apps with RxJS by James Wright at FrontCon 2019Managing State in React Apps with RxJS by James Wright at FrontCon 2019
Managing State in React Apps with RxJS by James Wright at FrontCon 2019DevClub_lv
 
Gerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRxGerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRxLoiane Groner
 
Reliability and Resilience
Reliability and ResilienceReliability and Resilience
Reliability and ResilienceDonald Belcham
 
Small pieces loosely joined
Small pieces loosely joinedSmall pieces loosely joined
Small pieces loosely joinedennui2342
 
Optimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsOptimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsMorgan Stone
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonKris Wallsmith
 
Network
NetworkNetwork
Networkphanleson
 

Similar to The combine triad (20)

Jasigsakai12 columbia-customizes-cas
Jasigsakai12 columbia-customizes-casJasigsakai12 columbia-customizes-cas
Jasigsakai12 columbia-customizes-cas
 
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online
10 Lessons Learned from using Kafka in 1000 Scala microservices - Scalar Online
 
$q and Promises in AngularJS
$q and Promises in AngularJS $q and Promises in AngularJS
$q and Promises in AngularJS
 
TCPIP Client Server program exampleHere is a simple example of .pdf
TCPIP Client Server program exampleHere is a simple example of .pdfTCPIP Client Server program exampleHere is a simple example of .pdf
TCPIP Client Server program exampleHere is a simple example of .pdf
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
 
Server Side Swift with Swag
Server Side Swift with SwagServer Side Swift with Swag
Server Side Swift with Swag
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Protocol-Oriented Networking
Protocol-Oriented NetworkingProtocol-Oriented Networking
Protocol-Oriented Networking
 
Soap tips
Soap tipsSoap tips
Soap tips
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extension
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
Managing State in React Apps with RxJS by James Wright at FrontCon 2019
Managing State in React Apps with RxJS by James Wright at FrontCon 2019Managing State in React Apps with RxJS by James Wright at FrontCon 2019
Managing State in React Apps with RxJS by James Wright at FrontCon 2019
 
Gerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRxGerenciamento de estado no Angular com NgRx
Gerenciamento de estado no Angular com NgRx
 
Reliability and Resilience
Reliability and ResilienceReliability and Resilience
Reliability and Resilience
 
Small pieces loosely joined
Small pieces loosely joinedSmall pieces loosely joined
Small pieces loosely joined
 
Optimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsOptimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page Apps
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-london
 
Network
NetworkNetwork
Network
 

More from Donny Wals

Your 🧠 on Swift Concurrency
Your 🧠 on Swift ConcurrencyYour 🧠 on Swift Concurrency
Your 🧠 on Swift ConcurrencyDonny Wals
 
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Donny Wals
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocolsDonny Wals
 
Adopting tdd in the workplace
Adopting tdd in the workplaceAdopting tdd in the workplace
Adopting tdd in the workplaceDonny Wals
 
The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!Donny Wals
 
Me and my importers
Me and my importersMe and my importers
Me and my importersDonny Wals
 
JSON and Swift, Still A Better Love Story Than Twilight
JSON and Swift, Still A Better Love Story Than TwilightJSON and Swift, Still A Better Love Story Than Twilight
JSON and Swift, Still A Better Love Story Than TwilightDonny Wals
 
Adopting tdd in the workplace
Adopting tdd in the workplaceAdopting tdd in the workplace
Adopting tdd in the workplaceDonny Wals
 
In Defense Of Core Data
In Defense Of Core DataIn Defense Of Core Data
In Defense Of Core DataDonny Wals
 
Effectively Producing And Shipping Frameworks For Multiple Platforms
Effectively Producing And Shipping Frameworks For Multiple PlatformsEffectively Producing And Shipping Frameworks For Multiple Platforms
Effectively Producing And Shipping Frameworks For Multiple PlatformsDonny Wals
 
Improving apps with iOS 10 notifications (do iOS 2016)
Improving apps with iOS 10 notifications (do iOS 2016)Improving apps with iOS 10 notifications (do iOS 2016)
Improving apps with iOS 10 notifications (do iOS 2016)Donny Wals
 
Talk - git task managers and ci
Talk - git task managers and ciTalk - git task managers and ci
Talk - git task managers and ciDonny Wals
 
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...Donny Wals
 
Marketing strategie Arto
Marketing strategie ArtoMarketing strategie Arto
Marketing strategie ArtoDonny Wals
 
Hoorcollege Flash 9-2-2012
Hoorcollege Flash 9-2-2012Hoorcollege Flash 9-2-2012
Hoorcollege Flash 9-2-2012Donny Wals
 

More from Donny Wals (15)

Your 🧠 on Swift Concurrency
Your 🧠 on Swift ConcurrencyYour 🧠 on Swift Concurrency
Your 🧠 on Swift Concurrency
 
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocols
 
Adopting tdd in the workplace
Adopting tdd in the workplaceAdopting tdd in the workplace
Adopting tdd in the workplace
 
The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!
 
Me and my importers
Me and my importersMe and my importers
Me and my importers
 
JSON and Swift, Still A Better Love Story Than Twilight
JSON and Swift, Still A Better Love Story Than TwilightJSON and Swift, Still A Better Love Story Than Twilight
JSON and Swift, Still A Better Love Story Than Twilight
 
Adopting tdd in the workplace
Adopting tdd in the workplaceAdopting tdd in the workplace
Adopting tdd in the workplace
 
In Defense Of Core Data
In Defense Of Core DataIn Defense Of Core Data
In Defense Of Core Data
 
Effectively Producing And Shipping Frameworks For Multiple Platforms
Effectively Producing And Shipping Frameworks For Multiple PlatformsEffectively Producing And Shipping Frameworks For Multiple Platforms
Effectively Producing And Shipping Frameworks For Multiple Platforms
 
Improving apps with iOS 10 notifications (do iOS 2016)
Improving apps with iOS 10 notifications (do iOS 2016)Improving apps with iOS 10 notifications (do iOS 2016)
Improving apps with iOS 10 notifications (do iOS 2016)
 
Talk - git task managers and ci
Talk - git task managers and ciTalk - git task managers and ci
Talk - git task managers and ci
 
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
 
Marketing strategie Arto
Marketing strategie ArtoMarketing strategie Arto
Marketing strategie Arto
 
Hoorcollege Flash 9-2-2012
Hoorcollege Flash 9-2-2012Hoorcollege Flash 9-2-2012
Hoorcollege Flash 9-2-2012
 

Recently uploaded

Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Recently uploaded (20)

Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

The combine triad