SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ă„hnlich wie 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
 

Ă„hnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

KĂĽrzlich hochgeladen

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 

KĂĽrzlich hochgeladen (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 âś“Call Girls In Kalyan ( Mumbai ) secure service
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 

The combine triad