Timer

Timer

특정 시간 간격이 지난 후 지정된 메세지를 대상 개체에게 보내어 지연 실행 합니다.

class Alarm: NSObject {
    @objc func ring(_ timer: Timer) {
        print("weak Up!")
    }
}

// 타이머를 이용한 지연 호출
let obj = Alarm()
var timer = Timer.scheduledTimer(timeInterval: 100,
                                 target: obj,
                                 selector: #selector(Alarm.ring(_:)),
                                 userInfo: nil,
                                 repeats: false)
** closure  사용
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in 
	print("클로저를 이용한 타이머")
}

Thread

  • 사용자 경험
    • 다운로드
    • 데이터 분석
    • 등등
  • 멀티 쓰레드 활용
    • NSObject와 셀렉터
    • Thread
    • OperationQueue, Operation

NsObject와 멀티 쓰레드

  • 멀티 스레드 큐: Thread 가 여러개 사용되면, 오히려 성능이 느려질수 있음. 그렇다면 현재 실행되고 있는 Thread의 개수를 제한하자 라는 생각에서 출발함.
    • 동시 동작 쓰레드 개수 조절
    • 쓰레드 대기/동작
    • 큐를 이용한 쓰레드 관리
    • OperationQueue, Operation

- 멀티 쓰레드 큐 : OperationQueue 쓰레드(Operation) 추가

func addOperation(_ op: Operation)
func addOperation(_ block: @escaping () -> Void)

- 쓰레드 취소

func cancelAllOperations()

- 동시 동작 쓰레드 개수 설정

var maxConcurrentOperationCount: Int

- 메인 쓰레드 큐

class var main : OperationQueue { get }
// Operation
class MyOperation : Operation {
    override func main() {
    // 멀티 쓰레드로 동작하는 코드
        for item in 0...10 {
            print(item)
            // 너무 빠르면 멀티쓰레드가 동작하는게 안보일수 있음. 그래서 약간의 간격을둠
            Thread.sleep(forTimeInterval: 0.02)
        }
    }
}

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 3

let opertaion1 = MyOperation()
let opertaion2 = MyOperation()
let opertaion3 = MyOperation()
let opertaion4 = MyOperation()
let opertaion5 = MyOperation()

queue.addOperation(opertaion1)
queue.addOperation(opertaion2)
queue.addOperation(opertaion3)
queue.addOperation(opertaion4)
queue.addOperation(opertaion5)
queue.waitUntilAllOperationsAreFinished()