| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Swift Sample」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
2行目: 2行目:
 
==[[Swift]] Sample==
 
==[[Swift]] Sample==
  
===Network===
+
==Network==
----
+
===データ取得===
====データ取得====
 
 
----
 
----
 
<pre>
 
<pre>
25行目: 24行目:
 
         task.resume()
 
         task.resume()
 
</pre>
 
</pre>
=====[[MacOS]]でエラーの場合=====
+
====[[MacOS]]でエラーの場合====
 
<code>Error Domain=NSURLErrorDomain Code=-1003</code>  
 
<code>Error Domain=NSURLErrorDomain Code=-1003</code>  
 
*https://www.poly-rhythm.com/hostname-could-not-be-found/
 
*https://www.poly-rhythm.com/hostname-could-not-be-found/
31行目: 30行目:
 
[[File:swift_macos_net_error.png|600px]]
 
[[File:swift_macos_net_error.png|600px]]
  
===UI===
+
==UI==
----
+
===バックグラウンドからUIを操作する===
====バックグラウンドからUIを操作する====
 
 
----
 
----
 
*observableobj が、ObservableObject の派生クラス
 
*observableobj が、ObservableObject の派生クラス
46行目: 44行目:
 
}
 
}
 
</pre>
 
</pre>
===処理===
+
==処理==
----
+
===サブプロセスを起動===
====サブプロセスを起動====
 
 
*プロセスを起動し、arp -a を呼び出し、出力
 
*プロセスを起動し、arp -a を呼び出し、出力
 
<pre>
 
<pre>

2021年4月6日 (火) 15:00時点における版

| Swift | SwiftUI |Xcode | Mac |

Swift Sample

Network

データ取得


        let url = URL(string: "https://www.typea.info/blog/")!
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error {
                print("\(error)\n")
                return
            }
            guard let data = data, let response = response as? HTTPURLResponse else {
                print("no data or no response.")
                return
            }
            if response.statusCode == 200 {
                if let text = String(bytes: data, encoding: .utf8) {
                    print(text)
                }
            }
        }
        task.resume()

MacOSでエラーの場合

Error Domain=NSURLErrorDomain Code=-1003

Swift macos net error.png

UI

バックグラウンドからUIを操作する


  • observableobj が、ObservableObject の派生クラス
  • contentフィールドに、@Published アノテーション
  • Viewで、@ObservedObjectを付与しインスタンスを生成
  • 上記で、バックグラウンドから、observableobj.contentを操作すると、UIはメインスレッドから触るように怒られる。

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

  • DispatchQueue.main.syncで囲む
DispatchQueue.main.sync {
    observableobj.content = text
}

処理

サブプロセスを起動

  • プロセスを起動し、arp -a を呼び出し、出力
    func arp() {
        let outputPipe = Pipe()

        func shell(path:String ,args: String...) -> Int32 {
            let task = Process()
            task.launchPath = path
            task.arguments = args
            task.standardOutput = outputPipe
            task.standardError = outputPipe
            
            task.launch()
            task.waitUntilExit()
            
            return task.terminationStatus
        }
        let _ = shell(path:"/usr/sbin/arp",args: "-a")
        let theTaskData = outputPipe.fileHandleForReading.readDataToEndOfFile()
        let stringResult = String(data: theTaskData, encoding: .utf8)
        
        print(stringResult!)
    }