Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 454 - Swift 2 NSURLSessionの理解から混沌にハマる...(URLSessionへ飛躍)

2017年2月26日:Swift 3に対応して追記

色々な事が少しずつ分かりかけてきました。

し・か・し、アプリの開発にはなかなか入れません。というのもiOSフレームワークの理解ができていないからです。Webで表示されている画像を取りこむこともまだできないんです(T_T) 

エラーの扱いが変わっただけで、NSURLSessionの使い方が分からなくなっています。

ネットを介してデータのやり取りをする場合、色々考えなければならないことがあります。

iOSのバージョンが変われば、用意されているAPIも変化します。今回、Swift 1からSwift 2への開発環境変化とiOS8からiOS9へのアップデイトを初めて経験し大きな戸惑いを感じているところです。

ネットを検索して調べていても古い情報に溢れているのが現状です。NSURLの扱いを調べていると、NSURLConnectionクラスの利用例を散見します。最初はこのクラスを使えばいいのかと思いました。しかし、少し調べていると、これはレガシークラスに位置づけられ、iOS7(これも古い!)からNSURLSessionクラスの利用が推奨されていました。

ということでNSURLSessionクラスの勉強を始めたのですが、調べれば調べるほど混沌とした澱みにはまり抜け出せなくなりました。

取りあえず、以下のような実装法が一般的だと思われます。

// NUSULSession利用時

let sessionConfig = 
    NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig)

let url = NSURL(string: "https://www.example.com")!
let task = session.dataTaskWithURL(url) {
    (data: NSData?, response: NSURLResponse?, error: NSError?) in
     ...
}
task?.resume()

このNSURLセッションも1)データをメモリにロードするだけ、2)データをファイルに保存する、3)変更したデータをセーブすることで、扱うメソッドが変化するし、1)のデータをメモリーにロードするたけならNSURLセッションを扱う必要も無さそうです。

そして、「...」に隠れている具体的なコーディングがよく分かっていません。情けないです。

iOS9から新しいAPIとして「UICollectionVIew」が加わりました。データの扱いがアプリ特有のサンドボックスを飛び越えました。すると、サンドボックス内の閉じられた領域でした参照のきかないNSFileManager API 群やNSURLファイルローディングシステムでは対応できなくなってしまいました。

新しいAPIとして次のようなものを理解する必要があります...

  1. NSMetadataQuery APIs
  2. security scoped bookmarks

プログラミングに疲れてきました。

2017年2月26日:追記

Swift 3になってNSURLSeesionからURLSession利用に変化したので上記の使い方も少々変更が加わっている。私が今の時点でコードするなら次のようになるでしょう。

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let url = URL(string: "https://www.example.com")
let task = 
    session.dataTask(with: url!) {(data, response, error) in
    guard let getData = data else {
        print("no such data")
        return
    }
    DispatchQueue(label: "someTask").async {
        // 時間のかかる作業
        DispatchQueue.main.async {
            // UIの操作
        }
    }
}
task.resume()

こういうコーディングにやっと慣れてきました。