Skip to content

Commit

Permalink
add DxFeedReconnectSample
Browse files Browse the repository at this point in the history
  • Loading branch information
kosyloa committed Jun 18, 2024
1 parent 2f4e2cb commit 24b695b
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 2 deletions.
2 changes: 2 additions & 0 deletions DXFeedFramework.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -916,6 +916,7 @@
64F73BA32B67B28B0088EC37 /* NativePromise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativePromise.swift; sourceTree = "<group>"; };
64F73BA52B67CD5B0088EC37 /* GraalException+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GraalException+Ext.swift"; sourceTree = "<group>"; };
64F9C6C12B4BFD8F003ED014 /* DXFeedconnect.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DXFeedconnect.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
64FDD7B62C21A09000D4469B /* DxFeedReconnectSample.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DxFeedReconnectSample.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
803BAC0D29BFA50700FFAB1C /* DXFeedFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DXFeedFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
803BAC1029BFA50700FFAB1C /* DxFeedSwiftFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DxFeedSwiftFramework.h; sourceTree = "<group>"; };
803BAC1529BFA50700FFAB1C /* DXFeedFrameworkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DXFeedFrameworkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -1115,6 +1116,7 @@
6433B1302BCE87D4004EFED7 /* RequestProfile.playground */,
64A631CF2BDFAA27002E1002 /* OnDemandSample.playground */,
643A329C2BD15F2900F6F790 /* LastEventsConsole.playground */,
64FDD7B62C21A09000D4469B /* DxFeedReconnectSample.playground */,
);
path = Playgrounds;
sourceTree = "<group>";
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,10 @@ is a simple demonstration of how to get live updates for Instrument Profiles
- [x] [ScheduleSample](https://github.com/dxFeed/dxfeed-graal-swift-api/blob/swift/Samples/Playgrounds/ScheduleSample.playground/Contents.swift)
is a simple demonstration of how to get various scheduling information for instruments
- [x] [FetchDailyCandles](https://github.com/dxFeed/dxfeed-graal-swift-api/blob/swift/Samples/Playgrounds/FetchDailyCandles.playground/Contents.swift) is a simple demonstration of how to fetch last N-days of candles for a specified symbol

- [x] [DxFeedReconnectSample](https://github.com/dxFeed/dxfeed-graal-swift-api/blob/swift/Samples/Playgrounds/DxFeedReconnectSample.playground/Contents.swift)
is a simple demonstration of how to connect to an endpoint, subscribe to market data events, handle reconnections
and re-subscribing.

## Current State

### Endpoint Roles
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import UIKit
import PlaygroundSupport
import DXFeedFramework

// Empty Event Listener with handler
class Listener: DXEventListener, Hashable {

static func == (lhs: Listener, rhs: Listener) -> Bool {
lhs === rhs
}

func hash(into hasher: inout Hasher) {
hasher.combine("\(self):\(stringReference(self))")
}
var callback: ([MarketEvent]) -> Void = { _ in }

func receiveEvents(_ events: [MarketEvent]) {
self.callback(events)
}

init(overrides: (Listener) -> Listener) {
_ = overrides(self)
}
}

// Empty Endpoint Listener with handler
class EndpoointStateListener: DXEndpointListener, Hashable {
func endpointDidChangeState(old: DXFeedFramework.DXEndpointState, new: DXFeedFramework.DXEndpointState) {
callback(old, new)
}

static func == (lhs: EndpoointStateListener, rhs: EndpoointStateListener) -> Bool {
lhs === rhs
}

func hash(into hasher: inout Hasher) {
hasher.combine("\(self):\(stringReference(self))")
}
var callback: (DXEndpointState, DXEndpointState) -> Void = { _,_ in }

init(overrides: (EndpoointStateListener) -> EndpoointStateListener) {
_ = overrides(self)
}
}


// Demonstrates how to connect to an endpoint, subscribe to market data events,
// handle reconnections and re-subscribing.
let address = "demo.dxfeed.com:7300" // The address of the DxFeed endpoint.
let symbol = "ETH/USD:GDAX" // The symbol for which we want to receive quotes.

// Create new endpoint and add a listener for state changes.
let endpoint = try DXEndpoint.getInstance()
let stateListener = EndpoointStateListener { listener in
listener.callback = { old, new in
print("Connection state changed: \(old) -> \(new)")
}
return listener
}
endpoint.add(listener: stateListener)

// Connect to the endpoint using the specified address.
try endpoint.connect(address)

// Create a subscription for Quote events.
let subscriptionQuote = try endpoint.getFeed()?.createSubscription(Quote.self)
// Listener must be attached before symbols are added.
let listener = Listener { listener in
listener.callback = { events in
events.forEach { event in
print(event.toString())
}
}
return listener
}
try subscriptionQuote?.add(listener: listener)

// Add the specified symbol to the subscription.
try subscriptionQuote?.addSymbols(symbol)

// Wait for five seconds to allow some quotes to be received.
Thread.sleep(forTimeInterval: 5)

// Disconnect from the endpoint.
try endpoint.disconnect()

// Wait for another five seconds to ensure quotes stop coming in.
Thread.sleep(forTimeInterval: 5)

// Reconnect to the endpoint.
// The subscription is automatically re-subscribed, and quotes start coming into the listener again.
// Another address can also be passed on.
try endpoint.connect(address)

// infinity execution
PlaygroundPage.current.needsIndefiniteExecution = true

// to finish execution run this line
PlaygroundPage.current.finishExecution()
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
<timeline fileName='timeline.xctimeline'/>
</playground>
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ do {
let connectedState = (try? onDemand.getEndpoint()?.getState()) ?? .notConnected
print("Current state is \(connectedState), on-demand time is \(timeStr)")
}
Thread.sleep(forTimeInterval: 1000)
Thread.sleep(forTimeInterval: 1)
}
// close endpoint completely to release resources
try onDemand.getEndpoint()?.closeAndAwaitTermination()
Expand Down

0 comments on commit 24b695b

Please sign in to comment.