Swift part10 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/02/20(月) 10:00:13.40ID:ChbPWtRt0
WWDC2014で発表されたAppleの新言語Swiftについて語りましょう

関連スレ

プログラミング言語Swift Part4
http://potato.2ch.net/test/read.cgi/mac/1484763495/

[SDK]iPhoneアプリ開発初心者質問箱48[touch][iPad]
http://potato.2ch.net/test/read.cgi/mac/1484217623/

Xcode part14
http://potato.2ch.net/test/read.cgi/mac/1476190499/

Swiftアンチスレ part1
http://echo.2ch.net/test/read.cgi/tech/1458491343/

前スレ
Swift part9
http://echo.2ch.net/test/read.cgi/tech/1476758084/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2デフォルトの名無しさん (ワッチョイ 7ba1-vagz)
垢版 |
2017/02/20(月) 11:06:31.94ID:Gb72M66o0
< `∀´>ニダー
2017/02/20(月) 13:14:50.34ID:mI2RJMjC0
さて、また荒らしと文字列の扱いについて談笑しようじゃないか
2017/02/20(月) 13:18:27.57ID:ij1Njg09d
極上の言語のスレはここかな?
5デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)
垢版 |
2017/02/20(月) 16:05:25.21ID:IDSTiL890
WebAPIを叩く最小限のコードを書いています。
Terminal.Appで実行したところ、動くには動くのですが、最後のsleep文をコメントアウトすると、結果が表示されません。
sleep文はダサいので、うまい具合にbackgroundで実行中のThreadを待ち合わせる方法は無いでしょうか?なお、Swift3.0.2です。

import Foundation
var dic: Any = ["": ""]

func printJSON(_ data: Data) {
do {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
dic = json
print(json)
} catch {
print("parse error!")
}

}
let url = URL(string: "http://date.jsontest.com/";)!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let jsonData = data {
printJSON(jsonData)
DispatchQueue.main.async(execute: { print("dic = ¥(dic)") })
//mainスレッドを捕まえて実行
}
}
task.resume()
print("OK")
sleep(1) // 1秒待つ
2017/02/20(月) 17:57:22.66ID:E/pOlJmJ0
Dispatch Group使ってwaitするか
DispatchWorkItem使ってwaitするか
かな
2017/02/20(月) 18:12:47.50ID:mI2RJMjC0
NSConditionでの実装例
ttp://swift.sandbox.bluemix.net/#/repl/58aab29626c3ba5cbe1d44ee

文字列でなんやかんや話してたエロい人たちがより良い例を出してくれると信じてる
2017/02/20(月) 20:20:31.52ID:jVgNOv8dd
>>5
Sleep()がカッコ悪いのでsyncで呼ぶ
2017/02/20(月) 21:23:20.98ID:E/pOlJmJ0
let task = URLSession.shared.dataTask(with: url) { data, response, error in

動きがなんかおかしいと思ったら
これcompletionHandler設定できてないような
2017/02/20(月) 21:45:53.42ID:E/pOlJmJ0
最後にdispatchMain()を追加して明示的にexit()すればいいみたい
http://stackoverflow.com/questions/31944011/how-to-prevent-a-command-line-tool-from-exiting-before-asynchronous-operation-co

#! /usr/bin/env swift
import Foundation

var dic: Any = ["": ""]

func printJSON(_ data: Data) {
do {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
dic = json
print(json)
} catch {
print("parse error!")
}

}

let url = URL(string: "http://date.jsontest.com/";)!
let task = URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in
if let jsonData = data {
printJSON(jsonData)
DispatchQueue.main.async(execute: {print("dic = ¥(dic)"); exit(EXIT_SUCCESS)})
}
})

task.resume()
print("OK")
dispatchMain()
2017/02/20(月) 21:51:31.66ID:E/pOlJmJ0
関係ないけどこの外部ステートへの依存の仕方はちょっと気持ち悪く感じる
var dic: Any = ["": ""]
12デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)
垢版 |
2017/02/20(月) 21:53:42.29ID:4Xv+kGUd0
>>9
メソッド引数の最後のclosureは()から出して記述できるんでは?
ただ、
DispatchQueue.main.async(execute: { print("dic = ¥(dic)") })

の部分がPlaygroundでは実行されるのに、terminal.appでは実行されない?
13デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)
垢版 |
2017/02/20(月) 22:01:34.57ID:4Xv+kGUd0
>>10
素晴らしい!
dispatchMain()
このグローバル関数が何をしてるのか?ようわからんけど。
2017/02/20(月) 22:05:11.29ID:E/pOlJmJ0
>>12
あらまほんとだ
ラベル関係なく使えるのね
15デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)
垢版 |
2017/02/20(月) 22:12:48.75ID:4Xv+kGUd0
Executes blocks submitted to the main queue.

って事は、
DispatchQueue.main.async(execute: { print("dic = ¥(dic)") })
を実行しているみたいだ。dispatchMain()は。
exit(EXIT_SUCCESS)が無いと、dispatchMain()は永遠に実行待ちするみたい。

しょうが無いので、^Z + kill %1した。
2017/02/20(月) 22:14:47.48ID:SiY39E3I0
while task.state == .running {
RunLoop.current.run(mode: .commonModes, before: .distantFuture)
}
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況