Post

Replies

Boosts

Views

Activity

ScrollView Memory Leaks with Button Style
Hi There, I have found a suspicious memory leak when I use Scroll View, List or anything else to list a View. This is Scroll view with Lazy Grid define: struct TravelingView1: View { var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.flexible())]) { ForEach(0..<10) {_ in Rectangle() .frame(height: 20) } } } .frame(height: 200) } } And Button Style in the View as: struct ScreenView1: View { @ObservedObject var drawRadioButtonViewModel: DrawRadioButtonViewModel1 var body: some View { RadioButton(type: .radioButton, toggle: drawRadioButtonViewModel.isRadioCheck, identifier: "Quick Split", radioWidth: 302, action: { [weak drawRadioButtonViewModel] in drawRadioButtonViewModel?.updateToggleCheck() }, label: {}) .offset(x: -CGFloat(100)/2, y: CGFloat(100)) Button(drawRadioButtonViewModel.isRadioCheck ? "Checked" : "Unchecked", action: { [weak drawRadioButtonViewModel] in drawRadioButtonViewModel?.updateToggleCheck() }) .offset(x: -CGFloat(100)/2, y: CGFloat(100) + 30) } } With Button Style as: struct RadioButton<Content: View>: View { let type: Button_styles let toggle: Bool var isDisable: Bool = false let identifier: String var radioWidth: Int let action: () -> Void let label: () -> Content enum Button_styles { case radioButton case checkBox } init(type: Button_styles, toggle: Bool, isDisable: Bool = false, identifier: String, radioWidth: Int, action: @escaping () -> Void, @ViewBuilder label: @escaping () -> Content) { self.type = type self.action = action self.radioWidth = radioWidth self.label = label self.toggle = toggle self.isDisable = isDisable self.identifier = identifier } init(action: @escaping () -> Void, @ViewBuilder label: @escaping () -> Content) { self.init(type: .radioButton, toggle: Bool(), isDisable: Bool(), identifier: String(), radioWidth: Int(), action: action, label: label) } var body: some View { Button(action: action, label: label) .buttonStyle(RadioButtonStyle(toggle: toggle, isDisable: isDisable, identifier: identifier, radioWidth: radioWidth, action: action)) } } struct RadioButtonStyle: ButtonStyle { var toggle: Bool var isDisable: Bool var identifier: String var radioWidth: Int var action: () -> Void func makeBody(configuration _: Configuration) -> some View { ZStack { if isDisable { DisableRadioButton(identifier: identifier, radioWidth: radioWidth, action: action) } else { if toggle { SelectedRadioButton(identifier: identifier, radioWidth: radioWidth, action: action) } else { NormalRadioButton(identifier: identifier, radioWidth: radioWidth, action: action) } } } } } struct SelectedRadioButton: View { var identifier: String var radioWidth: Int var action: () -> Void var body: some View { let offsetX = radioWidth / 2 + 20/2 + 12 ZStack { Image("common_check_on") .frame(width: CGFloat(20), height: CGFloat(20)) Text(identifier) .shadow(color: .black.opacity(0.75), radius: 1, x: 1, y: 1) .font(.system(size: 15)) .frame(width: CGFloat(radioWidth), height: CGFloat(20), alignment: .leading) .offset(x: CGFloat(offsetX), y: 0) .foregroundColor(.black) .onTapGesture { action() } } } } struct NormalRadioButton: View { var identifier: String var radioWidth: Int var action: () -> Void var body: some View { let offsetX = radioWidth / 2 + 20/2 + 12 ZStack { Image("common_check_off") .frame(width: CGFloat(20), height: CGFloat(20)) Text(identifier) .shadow(color: .black.opacity(0.75), radius: 1, x: 1, y: 1) .font(.system(size: 15)) .frame(width: CGFloat(radioWidth), height: CGFloat(20), alignment: .leading) .offset(x: CGFloat(offsetX), y: 0) .foregroundColor(.black) .onTapGesture { action() } } } } struct DisableRadioButton: View { var identifier: String var radioWidth: Int var action: () -> Void var body: some View { let offsetX = radioWidth / 2 + 20/2 + 12 ZStack { Image("common_check_off") .frame(width: CGFloat(20), height: CGFloat(20)) Text(identifier) .font(.system(size: 15)) .frame(width: CGFloat(radioWidth), height: CGFloat(20), alignment: .leading) .offset(x: CGFloat(offsetX), y: 0) .foregroundColor(.gray) .onTapGesture { action() } } } } I don't have any clue to find out where cause this leak. Could you please re-check it? Git: https://github.com/KuroPiii/SuspiciousMemoryLeaksLazyGrid
1
0
449
Aug ’23
How to get the current connected Network Interface in MacOS
I want to ping to IPV6 via local-link address, which needs to get the current active Network Interface like Wi-Fi or Ethernet via adapter connection. Like: ping6 fe80::122b:41ff:feb3:6a20%en0 With en0 is the Wi-Fi Interface. I have tried : private func getAllNetInterfaceName() -> [String] { let interfaces = SCNetworkInterfaceCopyAll() as? [SCNetworkInterface] ?? [] return interfaces.compactMap { SCNetworkInterfaceGetBSDName($0) as? String }.filter { !$0.isEmpty } } It returns the array of the current Interfaces, but I still can not get which one is currently connected. Did you have any clue?
9
0
2.2k
Jul ’23
Issue implementing the Connection with TLS/SSL method from TCP method using swift5.
Currently, We are developing a MacOS application and the app can connect successfully to a server "X.X.X.X:YYYY" with default TCP Option and none TLS by NWConnection. Note: the host name without any "http/https" or "ws/wss". If we add one of them before host name, the connection will be fail to connect. After the client connected to the server. Server will send a message for client contains "TLS". We have two certificate files from server so how can we setup the connection with those certificates for SSL Handshake after the connection has been established? We have a MFC App using the logic as description below: Open socket with TCP. Get the sever receive message. Get Handshake context if the message contains "TLS", Client credentials. Perform Client Handshake with the context above. Verify the Server CA with *.der and *.cer format About Certificate Authority, I used these lines of code to add to the keychain for testing: let rootCertPath = "***/enterprise_der.cer" let rootCertData = NSData(contentsOfFile: rootCertPath) let rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, rootCertData!) //var result: CFTypeRef1 let dict = NSDictionary.init(objects: [kSecClassCertificate, rootCert!], forKeys: [kSecClass as! NSCopying, kSecValueRef as! NSCopying]) err = SecItemAdd(dict, nil) The CA is automatically add to the login Keychain. I have tried to use the let tlsOptions = NWProtocolTLS.Options() sec_protocol_options_set_min_tls_protocol_version( tlsOptions.securityProtocolOptions, .TLSv12) but my app dose not connect to the IP totally. func connect(toHost host: String, port: UInt16 = broadcastPort) -> Void) { connection = NWConnection(host: .init(host), port: .init(integerLiteral: port), using: NWParameters(tls: nil, tcp: .init())) connection?.stateUpdateHandler = { ... } self.connection?.start(queue: .main) } Is there any solution for this case? I have tried several guidelines in StackOverFlow but It doesn't work or being deprecated.
5
0
943
Jun ’23