210623 Wed


1.最初の学習内容:Race Conditions


A race condition occurs when two threads access a shared variable at the same time.
The first thread reads the variable, and the second thread reads the same value from the variable. Then the first thread and second thread perform their operations on the value, and they race to see which thread can write the value last to the shared variable. The value of the thread that writes its value last is preserved, because the thread is writing over the value that the previous thread wrote.
工学分野において、競合状態(race condition)とは、2つ以上の入力または操作のタイミングまたは順序などが結果値に影響を及ぼす可能性のある状態を指す.入力が変化するタイミングや順序が予想と異なると、異常な結果を生じる可能性があります.これが競争リスクです.
Race conditions and deadlocks - Visual Basic
競争状態-ウィキペディア、私たち全員の百科事典

2.2番目の学習内容:デッドロック


A deadlock occurs when two threads each lock a different variable at the same time and then try to lock the variable that the other thread already locked.
As a result, each thread stops executing and waits for the other thread to release the variable. Because each thread is holding the variable that the other thread wants, nothing occurs, and the threads remain deadlocked.
膠着状態とは、2つ以上のタスクが互いに相手のタスクの完了を待っていて、結果的に何もできない状態を指す.例えば、2人がそれぞれ梯子の上と下にいる梯子があると仮定します.このとき、下の人が上へ、上の人が下へ行くと、二人はずっと相手が梯子から離れるのを待っていて、結局梯子から降りる人はいませんでした.コンピュータでは,硬直状態はマルチプログラミング環境でよく見られる問題である.この問題を解決する一般的な方法はまだない.
行き詰まり-ウィキペディア、私たち全員の百科事典

3.3番目の学習内容:値タイプと参照タイプ


メモリ割り当ては、値タイプと参照タイプの最大の違いです.前述したように、値タイプと参照タイプは、メモリのスタック領域とスタック領域にそれぞれ割り当てられます.スタック領域に割り当てられたものをスタック割り当て、スタック領域に割り当てられたものをスタック割り当てと呼びます.
スタック割り当てとヒップホップ割り当てには構造的な違いがある.
  • スタックは、スタックポインタを使用して迅速にアクセスできる簡単なデータ一方向アクセス構造です.したがって、スタック割り当てにはあまり時間がかかりません.
  • しかし、hipは動的構造であり、割り当てのたびに適切なメモリ領域があるかどうかを確認し、割り当てを処理する.このプロセスはスタックよりも複雑であるため、より多くのオーバーヘッドが発生します.したがって、通常は、よりパフォーマンスの良いコードを記述するために値タイプを使用することをお勧めします.
  • コスト


    ある処理を行うために入る間接処理時間、メモリなどを指す.
    例えば、Aという処理を簡単に実行すると、10秒が必要となり、セキュリティを考慮して追加Bという処理を追加し、処理時間が15秒の場合、オーバーヘッドは5秒となる.この処理Bを改良した結果、処理時間が12秒に達すると、この場合、オーバーヘッドが3秒短縮される
    In computer science, overhead is any combination of excess or indirect computation time, memory, bandwidth, or other resources that are required to perform a specific task.

    Copy-on-Write in Swift


    前述したように、値タイプをコピーすると、各インスタンスに一意のコピー値があります.しかし、必ずしもそうではない.リソースをより効率的に管理するために、スイッチは「書き込み時コピー」というテクノロジーを使用して、不要なインスタンスコピーを削減します.
    書き込み時コピーの基本原理は次のとおりです.
    インスタンスをコピーする場合は、まず参照によって不要なコピーを減らし、変更が発生した場合にのみ実際のコピーを行います.
    略称はCOWswiftでは、デフォルトでは  Collection  タイプではCOWを実施してもよいし、直接タイプではCOWを実施してもよい.
    簡単なコードでCOWの原理を理解してみましょう.
    var array1: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(UnsafeRawPointer(array1)) // 0x0000000100704210
    
    var array2 = array1
    print(UnsafeRawPointer(array2)) // 0x0000000100704210
    
    array2.removeLast() // Copy-on-Write
    print(UnsafeRawPointer(array1)) // 0x0000000100704210
    print(UnsafeRawPointer(array2)) // 0x0000000100404e70
    
    発表array1  array2  割り当てarray1は、2つのインスタンスのアドレス値が同じであることを保証することができる.COWによってコピーおよび参照されていません.このとき  メソッドを呼び出してarray2の最後の要素を削除すると変更されるため、参照が中断され、他のメモリ領域が割り当てられます.あとで  array2のアドレス値を確認し、値が変更されたことを確認します.
    Swift-Ya熊の中のReferenceとValue types
    Value and Reference Types - Swift Blog

    問題/難点→解決策


    画像を同期して受信する



    上記のコードでは、受信画像の動作が同期メソッドデータ(ContentsOf:imageURL)であるため、ダウンロードが完了するまで画面が停止する🙅‍

    画像を非同期で受信します。



    出典:Boost Cos 5.ムービー情報アプリ-4.GCD-3)DispatchQueue非同期プログラミング
  • DispatchQueue.global()はQ
  • のデフォルト構成で、バックグラウンドで随所に動作します.
  • プライマリ・スレッドにインポートするコードはDispatchQueueです.
  • ダウンロード時にユーザは画面
  • を上下に移動することができる.
    →セルのインデックスが変更されました(=別の場所にあるセル)
    セル設定データの索引と
    ダウンロード終了時のインデックスが異なる場合があります.
    過去を区別する.
    互いに一致する場合のみ
    イメージを確立しなければなりません!
    したがって、同じ場合にのみ、セルに画像を設定する必要があります.
    if index.row == indexPath.row

    ユニットのimageViewの画像を削除する必要があります
    これにより、後で画像をインポートする前に、他の人の画像を空にすることができます.
    cell.imageView?.image = nil
    DispatchQueue.global().async {
                    guard let imageURL: URL = URL(string: item.thumbnails.first!) else { return }
                    guard let imageData: Data = try? Data(contentsOf: imageURL) else { return }
                    
                    DispatchQueue.main.async {
                        if let index: IndexPath = tableView.indexPath(for: cell) {
                            if index.row == indexPath.row {
                                cell.itemThumbnail.image = UIImage(data: imageData)
                            }
                        }
                    }
                }
    以前とは異なり、イメージを非同期受信に変更できます.
    table viewはいいですね.
    同じコレクションビューを作成すると、画像が受信できなくなります...😣
    原因は何ですか.🤔
    未解決😣

    その他)mainViewからaddSubviewに追加されたビューとコレクションビューを削除


    シーケンスイメージボードに追加したので、コードとしてシーケンスイメージボードに戻す必要はありません.