質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

712閲覧

swiftでwebサーバから値を取得する。

hude02

総合スコア7

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/04/10 10:53

編集2018/04/11 05:15

前提・実現したいこと

swiftでwebサーバ(ローカルサーバ)から値を取ってきたいです。

発生している問題・エラーメッセージ

webサーバには「0」か「1」が書かれているテキストファイルがあるのですが、テキストファイルには0と書いてあるのに取ってきた値は1になっています。正常に値を取得できる場合もあるので、何が起きているのかさっぱり分からなくて困っています。

### 該当のソースコード func get(){ let url = URL(string:http://localhost〜) let config = URLSessionConfiguration.default config.requestCachePolicy = .reloadIgnoringLocalCacheData let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: url!, completionHandler: { (data, resp, err) in let getData: NSString? = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)! if Int(getData as! String) != nil{ value = Int(getData as! String)! print(value) <-------修正しました。 } }) task.resume() } ```swift ### 試したこと Charlesを用いてパケットキャプチャをしたのですが、正常に値を取得できているときはlocalhostとやりとりしていることが表示されますが、正常に値を取得できていないときは何も表示されません。 正常に値を取得できていないときは何が起きているのかと、その解決策を教えていただきたいです。 よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newmt

2018/04/10 11:19 編集

valueの初期値にはどのような値が入っていますでしょうか?また、getDataをコンソールに出力した際に正常に値を取得できた時とできなかった場合の値はどうなるか教えていただくことはできますでしょうか?
hude02

2018/04/10 11:47 編集

ご質問ありがとうございます。valueにはInt型で1が代入されています。 あと言い忘れていたのですが、xcodeのシミュレータで実行した時にこの現象が生じることが多く、実機で実行したときはほとんど起きていないような印象です。 getDataに関しては1が取得できたときは「Optional(1)」と表示され、0が取得できたときは「Optional(0)」が表示されています。
kakajika

2018/04/10 13:51

URLの中身は "http://localhost〜" ですか? iOS端末のブラウザでそのURLを開いた時に期待するデータは表示されますか?
newmt

2018/04/10 21:21

「テキストファイルには0と書いてあるのに取ってきた値は1になっています。」は値が取得できているときにも起きていますでしょうか?また、「テキストファイルには0と書いてあるのに取ってきた値は1になっています。」はどうやって確認されていますでしょうか?(画面に表示しているのでしょうか?)
hude02

2018/04/11 04:39

kakajikaさん、ご質問ありがとうございます。URLの中身は正確にはlocalhostの後にも続いておりますが、特に必要ないかと思ったので「〜」という風に省略させていただきました。今、確認したところブラウザでこのURLを開いた時に期待するデータは表示されました。
hude02

2018/04/11 04:50

newmtさん。値は毎回取得されるのですが、その値がテキストファイルに書いてある値と同じではないことがあります。ちょっと答えになっていなかったらすみません。確認方法は、サーバから取得した値をコンソールに表示するようにしているので、その値とサーバにあるテキストファイルの値が異なれば「違う」という風に判断しています。また、最初の質問にも「正常に取得できる時もある」と書きましたが現在は正常に取得できる状態になっています。しかしまた作業を進めると正常に取得できない状態が訪れるので、この現象が何なのか知りたいです。
newmt

2018/04/11 05:00

コンソール出力はvalueに値を設定している直後でされていますでしょうか?「テキストファイルには0と書いてあるのに取ってきた値は1になっています。」とのことから値が設定できず、初期値の1が出力されている場合があるのかと思ったのですが。
hude02

2018/04/11 05:13

そういうことですね。ちょっと上のソースコードを色々と消し過ぎてしまったのですが、実際はvalueのすぐ下にprint(value)が入っています。なのでif文の中を通っているので初期値の1ではないような気がします。ややこしくしてすみません。
fuzzball

2018/04/11 06:35 編集

let getData: ... の上の行に if let data = data {print(String(data: data, encoding: .utf8) ?? "nil string")} else {print("nil data")} を追加して出力を教えて下さい。
hude02

2018/04/11 09:20

fuzzballさん、回答ありがとうございます。質問に書いたのですが、この現象は失敗するときもあれば正常に値を取得できる時もあって現在ではなぜか正常に値を取得できています。なのでfuzzballさんのコードを入力したところ、テキストファイルに書いてある値が正常に表示されました。なので、テキストファイルに1と書いてあれば「Optional(1) 1」と表示されました。
fuzzball

2018/04/11 09:38

おかしくなったときに出力を教えて下さい。
fuzzball

2018/04/11 10:06

サーバーとの通信の問題のような気がするので、別のタグも付けた方が良いような。
fuzzball

2018/04/11 10:22 編集

URLSession(configuration: config) だとどうでしょうか?(なんかキャッシュ効いてそう)
newmt

2018/04/11 11:14

fuzzballさんのおっしゃるようにキャッシュ周りが怪しい気がしますね。上記の方法でできなかった場合、let task = URLSession.shared.dataTaskとして試してみてもよろしいでしょうか?また、Simulatorのキャッシュの削除もされてみた方がよいかもしれません。https://youtachannel.com/ios-simulator-reset-content-and-setting/
hude02

2018/04/11 11:59

fuzzballさん、タグに関してはちょっと投稿が初めてだったので適当にやってしまいました。すみません。またおかしくなったら出力もやってみます。僕もキャッシュ周りなのかと思い、ignoringLocalCacheDataとか入れてみたんですがURLSession(configuration: config)にしないと意味なかったですかね。これもまたおかしくなったら試してみます!
hude02

2018/04/11 12:04

newmtさん、知識が薄いまま使っているので質問があるのですがURLSession.shared.dataTaskの「shared」を入れるとどう変わるのでしょうか?あとSimulatorのキャッシュの削除とソースコードに書いてあるreloadIgnoringLocalCacheDataは異なるものなのでしょうか?
newmt

2018/04/11 21:36 編集

sharedはURLSessionのデフォルトの設定を提供するインスタンスでconfigurationの設定が不要になります。URLSessionは自分でインスタンス化するとメモリーリークを起こすことがあるのでもしかしたらそれが関連しているのかと考え、その心配がないsharedを使ってみるとどうかなと思いました。https://qiita.com/SatoTakeshiX/items/b65f5518a025c23e1d9d reloadIgnoringLocalCacheDataも同じ効果があると思いますが、simulatorはたまにおかしくなることがあるので念のため一度クリアしてみて検証した方がよいかと思い提案してみました。
hude02

2018/04/12 03:27

newmtさん、メモリリークの問題があるんですね。また同じ現象に出会ったら両方とも試してみますね。細かく教えていただきありがとうございます!
guest

回答1

0

ベストアンサー

昨日、確認が取れなかったので、ひとまず「質問への追記・修正の依頼」に記載しましたが、確認が取れましたので回答とします。

URLSessionConfiguration.defaultはシングルトンではなく、呼び出すたびに新しいインスタンスを返します。

swift

1print(URLSessionConfiguration.default) 2print(URLSessionConfiguration.default) 3//=> <__NSCFURLSessionConfiguration: 0x7f9743f05c60> 4//=> <__NSCFURLSessionConfiguration: 0x7f9743d02620>

また、デフォルトのrequestCachePolicyuseProtocolCachePolicyです。

以上を踏まえて、

swift

1let config = URLSessionConfiguration.default 2config.requestCachePolicy = .reloadIgnoringLocalCacheData 3let session = URLSession(configuration: URLSessionConfiguration.default)

上記コードではキャッシュポリシーを変更したURLSessionConfigurationを使用していることにならず、デフォルトのキャッシュポリシーを使用したURLSessionConfigurationが使われていることになりますので、キャッシュポリシーを変更したURLSessionConfiguration、すなわちconfigを使用することで問題は解決すると思います。

swift

1let session = URLSession(configuration: config)

投稿2018/04/12 00:33

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hude02

2018/04/12 03:32

丁寧な回答ありがとうございます!申し訳ないことに現状はこの問題が発生していないために書いていただいたコードを試すことができないですが、ひとまずベストアンサーとさせていただきます!他の皆さんも様々に教えていただきありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問