- LowData mode exercise with URLSession Publisher 프로젝트
- WebSocket Client with URLSessionWebSocketTask 프로젝트
- WebSocket Server with Network WebSocket 프로젝트
Non Constrained Network | Low Data mode |
---|---|
func adaptiveLoader(session: URLSession = .shared, regularURL: URL, lowDataURL: URL) -> AnyPublisher<Data, Error> {
var request = URLRequest(url: regularURL)
request.allowsConstrainedNetworkAccess = false
return session.dataTaskPublisher(for: request)
.tryCatch { error -> URLSession.DataTaskPublisher in
guard error.networkUnavailableReason == .constrained else {
throw error
}
return session.dataTaskPublisher(for: lowDataURL)
}
.tryMap { data, response -> Data in
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw CustomError.invalidserverResponse
}
return data
}
.eraseToAnyPublisher()
}
![example](https://private-user-images.githubusercontent.com/25360781/299258609-1c951e74-c187-45fd-a72a-b8f0ab2b80fb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE0Mjk1NDMsIm5iZiI6MTcyMTQyOTI0MywicGF0aCI6Ii8yNTM2MDc4MS8yOTkyNTg2MDktMWM5NTFlNzQtYzE4Ny00NWZkLWE3MmEtYjhmMGFiMmI4MGZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE5VDIyNDcyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJmN2M1OTFhNWRjNDZjYTA0ZDg1MjdmODY1ZjRkZDJlMjdmNTRmNGUxY2NkYjE0YzZhNjBkMWFlZjhkMWJjYzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.4aKrDbiNFXzc5zrfao59ExIvXrEVrFQEQiOO-L87lok)
// NativeClient.swift
func readMessage() {
guard let task = self.webSocketTask else { return }
task.receive { result in
switch result {
case .success(.data(let data)):
self.delegate?.onMessage(connection: self, data: data)
self.readMessage()
default:
self.disconnect()
}
}
}
func send(_ message: MessageDTO) {
if let data = try? JSONEncoder().encode(message) {
webSocketTask?.send(.data(data), completionHandler: { error in
if let error = error {
self.delegate?.onError(connection: self, error: error)
}
})
}
}