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.
Apr ’23