Post

Replies

Boosts

Views

Activity

Reply to IP Multicast - Packet sent on button click issue
import SwiftUI import os import Foundation import Network class MulticastController { var multicastIP : NWEndpoint.Host = "239.6.4.50" var multicastPort : NWEndpoint.Port = 5890 let group: NWConnectionGroup init() { let endpoints: [NWEndpoint] = [.hostPort(host: multicastIP, port: multicastPort)] guard let multicast = try? NWMulticastGroup(for: endpoints) else { fatalError("Multicast Group setup error") } let params: NWParameters = .udp params.allowLocalEndpointReuse = true group = NWConnectionGroup(with: multicast, using: params) group.setReceiveHandler(maximumMessageSize: 16384, rejectOversizedMessages: true) { message, data, isComplete in if let data, let value = String(data: data, encoding: .utf8) { print(message, value, isComplete) } else { print(message, isComplete) } } group.stateUpdateHandler = { (newState) in print("Group entered state \(String(describing: newState))") } group.start(queue: .main) } func sendMulticastPacket(message: String) { let data = message.data(using: .utf8) group.send(content: data) { error in if let error = error { print(error.localizedDescription) } else { print("ok") } } } } struct ContentView: View { var session = MulticastController() let message = "Hello World" var body: some View { VStack { Button(action: { session.sendMulticastPacket(message: message) }, label: { Text("Send Multicast Packet") } ) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Apr ’23
Reply to How to structure code to handle mutations from Vision (face detection) requests
Replace mrbean with another image in the assets folder. import SwiftUI @main struct DevForumVisionApp: App { @StateObject var model = VisionModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(model) } } } import SwiftUI import Vision struct ContentView: View { @EnvironmentObject private var model: VisionModel var body: some View { VStack { Image(uiImage: model.uiImage) .resizable() .aspectRatio(contentMode: .fit) Text("faces: \(model.faceCount)") } .onAppear(perform: { model.run() }) .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(VisionModel()) } } class VisionModel: ObservableObject { @Published private(set) var uiImage = UIImage(named: "mrbean")! @Published private(set) var faceCount: Int = 0 private(set) var request: VNDetectFaceRectanglesRequest? private(set) var handler: VNImageRequestHandler? private(set) var requestOptions = [VNImageOption: Any]() init() { } func run() { handler = VNImageRequestHandler(cgImage: uiImage.cgImage!, options: requestOptions) self.request = VNDetectFaceRectanglesRequest() { [weak self] request, error in if error == nil, let count = request.results?.count { self?.faceCount = count } } if let request, let handler { do { try handler.perform([request]) } catch { print(error) } } } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Apr ’23
Reply to Combine AnyCancellable.store(in:) EXC_BAD_ACCESS
Making request async is the issue. This version works without issue in playgrounds: import UIKit import Combine struct User: Codable { let userId: Int let id: Int let title: String let completed: Bool } struct Download { private var cancellables = Set<AnyCancellable>() mutating func request() { URLSession.shared .dataTaskPublisher(for: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!) .map{$0.data} .decode(type: User.self, decoder: JSONDecoder()) .receive(on: DispatchQueue.main) .sink(receiveCompletion: { print ("Received completion: \($0).") }, receiveValue: { data in print(data) }) .store(in: &cancellables) } } var download = Download() download.request() or making request async as follows in playgrounds: import UIKit import Combine struct User: Codable { let userId: Int let id: Int let title: String let completed: Bool } struct Download { private var cancellables = Set<AnyCancellable>() mutating func request() async -> User { return await withCheckedContinuation { continuation in URLSession.shared .dataTaskPublisher(for: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!) .map{$0.data} .decode(type: User.self, decoder: JSONDecoder()) .receive(on: DispatchQueue.main) .sink(receiveCompletion: { print ("Received completion: \($0).") }, receiveValue: { data in continuation.resume(returning: data) }) .store(in: &cancellables) } } } Task { var download = Download() let user = await download.request() print(user) }
Topic: Programming Languages SubTopic: Swift Tags:
Apr ’23
Reply to Please Create a Sendable Version of CKRecord or Make CKRecord Sendable
You can take responsibility for it being Sendable. By default the Sendable protocol is made unavailable to CKRecord. extension CKRecord : @unchecked Sendable { } But these are the supported types that are sendable by default. https://developer.apple.com/documentation/swift/sendable NSFoundation types mention above NSStrings, NSData will not be Sendable but the Swift Foundation types Strings, Data are.
Topic: App & System Services SubTopic: iCloud Tags:
Apr ’23
Reply to IP Multicast - Packet sent on button click issue
import SwiftUI import os import Foundation import Network class MulticastController { var multicastIP : NWEndpoint.Host = "239.6.4.50" var multicastPort : NWEndpoint.Port = 5890 let group: NWConnectionGroup init() { let endpoints: [NWEndpoint] = [.hostPort(host: multicastIP, port: multicastPort)] guard let multicast = try? NWMulticastGroup(for: endpoints) else { fatalError("Multicast Group setup error") } let params: NWParameters = .udp params.allowLocalEndpointReuse = true group = NWConnectionGroup(with: multicast, using: params) group.setReceiveHandler(maximumMessageSize: 16384, rejectOversizedMessages: true) { message, data, isComplete in if let data, let value = String(data: data, encoding: .utf8) { print(message, value, isComplete) } else { print(message, isComplete) } } group.stateUpdateHandler = { (newState) in print("Group entered state \(String(describing: newState))") } group.start(queue: .main) } func sendMulticastPacket(message: String) { let data = message.data(using: .utf8) group.send(content: data) { error in if let error = error { print(error.localizedDescription) } else { print("ok") } } } } struct ContentView: View { var session = MulticastController() let message = "Hello World" var body: some View { VStack { Button(action: { session.sendMulticastPacket(message: message) }, label: { Text("Send Multicast Packet") } ) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Replies
Boosts
Views
Activity
Apr ’23
Reply to How to structure code to handle mutations from Vision (face detection) requests
Replace mrbean with another image in the assets folder. import SwiftUI @main struct DevForumVisionApp: App { @StateObject var model = VisionModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(model) } } } import SwiftUI import Vision struct ContentView: View { @EnvironmentObject private var model: VisionModel var body: some View { VStack { Image(uiImage: model.uiImage) .resizable() .aspectRatio(contentMode: .fit) Text("faces: \(model.faceCount)") } .onAppear(perform: { model.run() }) .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(VisionModel()) } } class VisionModel: ObservableObject { @Published private(set) var uiImage = UIImage(named: "mrbean")! @Published private(set) var faceCount: Int = 0 private(set) var request: VNDetectFaceRectanglesRequest? private(set) var handler: VNImageRequestHandler? private(set) var requestOptions = [VNImageOption: Any]() init() { } func run() { handler = VNImageRequestHandler(cgImage: uiImage.cgImage!, options: requestOptions) self.request = VNDetectFaceRectanglesRequest() { [weak self] request, error in if error == nil, let count = request.results?.count { self?.faceCount = count } } if let request, let handler { do { try handler.perform([request]) } catch { print(error) } } } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Apr ’23
Reply to Combine AnyCancellable.store(in:) EXC_BAD_ACCESS
Making request async is the issue. This version works without issue in playgrounds: import UIKit import Combine struct User: Codable { let userId: Int let id: Int let title: String let completed: Bool } struct Download { private var cancellables = Set<AnyCancellable>() mutating func request() { URLSession.shared .dataTaskPublisher(for: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!) .map{$0.data} .decode(type: User.self, decoder: JSONDecoder()) .receive(on: DispatchQueue.main) .sink(receiveCompletion: { print ("Received completion: \($0).") }, receiveValue: { data in print(data) }) .store(in: &cancellables) } } var download = Download() download.request() or making request async as follows in playgrounds: import UIKit import Combine struct User: Codable { let userId: Int let id: Int let title: String let completed: Bool } struct Download { private var cancellables = Set<AnyCancellable>() mutating func request() async -> User { return await withCheckedContinuation { continuation in URLSession.shared .dataTaskPublisher(for: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!) .map{$0.data} .decode(type: User.self, decoder: JSONDecoder()) .receive(on: DispatchQueue.main) .sink(receiveCompletion: { print ("Received completion: \($0).") }, receiveValue: { data in continuation.resume(returning: data) }) .store(in: &cancellables) } } } Task { var download = Download() let user = await download.request() print(user) }
Topic: Programming Languages SubTopic: Swift Tags:
Replies
Boosts
Views
Activity
Apr ’23
Reply to Please Create a Sendable Version of CKRecord or Make CKRecord Sendable
You can take responsibility for it being Sendable. By default the Sendable protocol is made unavailable to CKRecord. extension CKRecord : @unchecked Sendable { } But these are the supported types that are sendable by default. https://developer.apple.com/documentation/swift/sendable NSFoundation types mention above NSStrings, NSData will not be Sendable but the Swift Foundation types Strings, Data are.
Topic: App & System Services SubTopic: iCloud Tags:
Replies
Boosts
Views
Activity
Apr ’23