1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Swift]PromiseKit を利用した非同期処理

Posted at

書くこと

Promise を利用した非同期処理
※忘れた時に確認するための備忘録

開発環境

PC MacBook Air(13-inch,2017)
PC OS macOS Catalina(ver 10.15.6)
IDE Xcode(ver 12.0.1)
iPhone SE(2nd Generation)
iPhone OS ver 14.0.1
Swift 5.3

前提条件

① MacBook Air と iPhone は USBケーブルで接続する
② Xcode を利用してデスクトップ上に Sample というプロジェクトアプリを作成する
Sample は既に CocoaPods 利用して PromiseKit を導入している状態である
④ 今回は、 Sample にある ViewController.swift にコードを記述する

基本的なコード

ViewController.swift
import UIKit
import PromiseKit

class ViewController: UIViewController {

        override func viewDidLoad() {

            let promise = Promise<String> { value in
                // 処理
            }.done { value in
                // 成功した時に実行
            }.catch { error in
                // 失敗した時に実行
            }.finally {
                // 最後に実行
            }
        }
    
}

コード例①

ViewController.swift
import UIKit
import PromiseKit

class ViewController: UIViewController {

        override func viewDidLoad() {
            print("----- promise ここから -----")
            
            let promise = Promise<String> { value in
                // 処理
                DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
                    value.fulfill("sample1")
                    print("\(Date()) [1]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
                    value.fulfill("sample2")
                    print("\(Date()) [2]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
                    value.fulfill("sample3")
                    print("\(Date()) [3]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                    value.fulfill("sample4")
                    print("\(Date()) [4]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                    value.fulfill("sample5")
                    print("\(Date()) [5]:\(value)")
                }
                print("\(Date()) [6]:\(value)")
            }.done { value in
                // 成功した時に実行
                print("\(Date()) [7]:\(value)")
            }.catch { error in
                // 失敗した時に実行
                print("\(Date()) [8]:\(error.localizedDescription)")
            }.finally {
                // 最後に実行
                print("\(Date()) [9]:処理を終了します")
            }
            print("----- promise ここまで -----")
        }
    
}

コード例① 実行結果

Xcodeログ
----- promise ここから -----
2020-10-22 13:16:28 +0000 [6]:PromiseKit.Resolver<Swift.String>
----- promise ここまで -----
2020-10-22 13:16:29 +0000 [5]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:16:29 +0000 [7]:sample5
2020-10-22 13:16:29 +0000 [9]:処理を終了します
2020-10-22 13:16:30 +0000 [4]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:16:31 +0000 [3]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:16:32 +0000 [2]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:16:33 +0000 [1]:PromiseKit.Resolver<Swift.String>

コード例②

ViewController.swift
import UIKit
import PromiseKit

enum SampleError: Error {
    case error1
    case error2
    case error3
}

class ViewController: UIViewController {

        override func viewDidLoad() {
            print("----- promise ここから -----")
            
            let promise = Promise<String> { value in
                // 処理
                value.reject(SampleError.error1)
                
                DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
                    value.fulfill("sample1")
                    print("\(Date()) [1]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
                    value.fulfill("sample2")
                    print("\(Date()) [2]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
                    value.fulfill("sample3")
                    print("\(Date()) [3]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                    value.fulfill("sample4")
                    print("\(Date()) [4]:\(value)")
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                    value.fulfill("sample5")
                    print("\(Date()) [5]:\(value)")
                }
                print("\(Date()) [6]:\(value)")
            }.done { value in
                // 成功した時に実行
                print("\(Date()) [7]:\(value)")
            }.catch { error in
                // 失敗した時に実行
                print("\(Date()) [8]:\(error.localizedDescription)")
            }.finally {
                // 最後に実行
                print("\(Date()) [9]:処理を終了します")
            }
            print("----- promise ここまで -----")
        }
    
}

コード例② 実行結果

Xcodeログ
----- promise ここから -----
2020-10-22 13:26:04 +0000 [6]:PromiseKit.Resolver<Swift.String>
----- promise ここまで -----
2020-10-22 13:26:04 +0000 [8]:The operation couldn’t be completed. (Sample.SampleError error 0.)
2020-10-22 13:26:04 +0000 [9]:処理を終了します
2020-10-22 13:26:05 +0000 [5]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:26:06 +0000 [4]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:26:07 +0000 [3]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:26:08 +0000 [2]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:26:09 +0000 [1]:PromiseKit.Resolver<Swift.String>

コード例③

ViewController.swift
import UIKit
import PromiseKit

enum SampleError: Error {
    case error1
    case error2
    case error3
}

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        print("----- promise ここから -----")
        
        let promise = Promise<String> { value in
            // 処理
            value.fulfill("sample1")
            print("\(Date()) [1]:\(value)")
            
            value.fulfill("sample2")
            print("\(Date()) [2]:\(value)")
            
            value.fulfill("sample3")
            print("\(Date()) [3]:\(value)")
            
            value.fulfill("sample4")
            print("\(Date()) [4]:\(value)")
            
            value.fulfill("sample5")
            print("\(Date()) [5]:\(value)")
            
            print("\(Date()) [6]:\(value)")
        }.done { value in
            // 成功した時に実行
            print("\(Date()) [7]:\(value)")
        }.catch { error in
            // 失敗した時に実行
            print("\(Date()) [8]:\(error.localizedDescription)")
        }.finally {
            // 最後に実行
            print("\(Date()) [9]:処理を終了します")
        }
        print("----- promise ここまで -----")
    }
    
}

コード例③ 実行結果

Xcodeログ
----- promise ここから -----
2020-10-22 13:29:03 +0000 [1]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:29:03 +0000 [2]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:29:03 +0000 [3]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:29:03 +0000 [4]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:29:03 +0000 [5]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:29:03 +0000 [6]:PromiseKit.Resolver<Swift.String>
----- promise ここまで -----
2020-10-22 13:29:03 +0000 [7]:sample1
2020-10-22 13:29:03 +0000 [9]:処理を終了します

コード例④

ViewController.swift
import UIKit
import PromiseKit

enum SampleError: Error {
    case error1
    case error2
    case error3
}

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        print("----- promise ここから -----")
        
        let promise = Promise<String> { value in
            // 処理
            value.reject(SampleError.error1)
            
            value.fulfill("sample1")
            print("\(Date()) [1]:\(value)")
            
            value.fulfill("sample2")
            print("\(Date()) [2]:\(value)")
            
            value.fulfill("sample3")
            print("\(Date()) [3]:\(value)")
            
            value.fulfill("sample4")
            print("\(Date()) [4]:\(value)")
            
            value.fulfill("sample5")
            print("\(Date()) [5]:\(value)")
            
            print("\(Date()) [6]:\(value)")
        }.done { value in
            // 成功した時に実行
            print("\(Date()) [7]:\(value)")
        }.catch { error in
            // 失敗した時に実行
            print("\(Date()) [8]:\(error.localizedDescription)")
        }.finally {
            // 最後に実行
            print("\(Date()) [9]:処理を終了します")
        }
        print("----- promise ここまで -----")
    }
    
}

コード例④ 出力結果

Xcodeログ
----- promise ここから -----
2020-10-22 13:33:08 +0000 [1]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:33:08 +0000 [2]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:33:08 +0000 [3]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:33:08 +0000 [4]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:33:08 +0000 [5]:PromiseKit.Resolver<Swift.String>
2020-10-22 13:33:08 +0000 [6]:PromiseKit.Resolver<Swift.String>
----- promise ここまで -----
2020-10-22 13:33:08 +0000 [8]:The operation couldn’t be completed. (Sample.SampleError error 0.)
2020-10-22 13:33:08 +0000 [9]:処理を終了します

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?