iOS/UMC

[iOS] UMC iOS 세미나 6주 차

year.number 2022. 10. 31. 23:14

 

Thread

(이야기 등의)가닥[맥락], 프로세스의 흐름, 프로세스의 내부에 속함, 프로세스의 시작과 종료 담당

💡프로세스(실행 중인 프로그램) 개념도 필요!

 

 

프로세스의 전반적인 구조

프로그램 안에서 스레드들이 각자 역할을 정해서 분담 -> 수행

하나의 프로세스 안에는 최소 1개의 스레드가 존재하게 된다.

 

 

 


Multi-Thread

일만 분배하고, 줄어들지는 않기 때문에 분배를 하기 전과 후의 걸리는 시간은 같음

작업의 순서를 가질 수 있음 (ex. 파일 B를 다운받으려면 파일 A가 필요한 경우 작업의 순서 필요)

 

 

 

Thread

- 프로세스 내에서 실행되는 흐름의 단위
- Multi-Thread를 통해 Thread들이 각각 독립적인 흐름을 가질 수 있음(일의 능률과는 거리가 멀다. 단순히 분배만 할 뿐)
- 공유 자원에 동시 접근하여 생기는 문제를 방지하기 위해 Lock을 활용함

 

Dispatch Queue를 활용해서 Multi-Thread를 구현할 수 있다!

 

 


 

Main Thread: DispatchQueue.main -> Ui 작업

background Thread: DispatchQueue.global() -> Ui 작업 외의 모든 작업

 

 

//
//  ViewController.swift
//  Week5
//
//  Created by yeonsu on 2022/10/31.
//

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var firstView: UIView!
    @IBOutlet weak var secondView: UIView!
    
    var colorList: [UIColor] = [
        .blue,
        .brown,
        .clear,
        .cyan,
        .darkText,
        .gray,
        .lightText,
        .red,
        .yellow,
        .green
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        threadTest()
        colors()
    }
    
    func threadTest() {
        // DispatchQueue.main      // Ui 작업 관련
        
        // 단일 Thread. 1-10까지 출력
        // 일을 여러 개의 스레드로 나누어서 처리
        // 동기 방식(sync): Ui 외 모든 작업 관련, 차례대로 수행
        
        // 비동기 (async): 다른 작업의 스레드가 끝나는 걸 기다리지 않고 같이 수행, 실행할 때마다 처리 순서가 달라짐
        /*
        DispatchQueue.global().async {
            for i in 1...10 {
                print(i)
                sleep(1)
                
            }
        }
        
        DispatchQueue.global().async {
            for i in 11...10 {
                print(i)
                sleep(1)
            }
         */
        
        DispatchQueue.global().async {
            for color in self.colorList {
                DispatchQueue.main.sync {
                    self.firstView.backgroundColor = color
                }
                sleep(1)
            }
        }
        
        DispatchQueue.global().async {
            for color in self.colorList.reversed() {
                DispatchQueue.main.sync {
                    self.secondView.backgroundColor = color
                }
                sleep(1)
            }
        }
    }
}

func colors() {
}