Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

GCDの例

SwiftでGCDのgroup等の使い方のサンプルを書いてみた。

//
//  ViewController.swift
//  GCDSample
//
//  Created by KatagiriSo on 2017/09/19.
//  Copyright © 2017年 RodhosSoft. All rights reserved.
//

import UIKit

class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource{
    
    
    struct Menu {
        let name:String
    }
    
    let menu:[Menu] = [Menu(name: NSStringFromSelector(#selector(AsyncBarrier))),
                       Menu(name: NSStringFromSelector(#selector(GroupWait))),
                       Menu(name: NSStringFromSelector(#selector(GroupNotify))),
                       Menu(name: NSStringFromSelector(#selector(GroupEnterLeave))),
                       Menu(name: NSStringFromSelector(#selector(SemaphoExample)))

        
                       ]
    
    func makeEqualConstraint(item:Any, toItem:Any, attribute:NSLayoutAttribute) ->  NSLayoutConstraint{
        return NSLayoutConstraint(item: item, attribute: attribute, relatedBy: .equal, toItem: toItem, attribute: attribute, multiplier: 1.0, constant: 0)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tableView:UITableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

        
        self.view.addSubview(tableView)
        
        
        let l = makeEqualConstraint(item: tableView, toItem: self.view, attribute: .left)
        let r = makeEqualConstraint(item: tableView, toItem: self.view, attribute: .right)
        let t = makeEqualConstraint(item: tableView, toItem: self.view, attribute: .top)
        let b = makeEqualConstraint(item: tableView, toItem: self.view, attribute: .bottom)
        
        l.isActive = true
        r.isActive = true
        t.isActive = true
        b.isActive = true

    }
    
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return menu.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = menu[indexPath.row].name
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selector = NSSelectorFromString(menu[indexPath.row].name)
        self.perform(selector)
    }
    
    func AsyncBarrier() {
        print("\(#function)")
        
        let queue = DispatchQueue(label: "asyncBarrierTest")
        [1,2,3,4,5,6,7,8,9,10].forEach { n in
            queue.async {
                print("done \(n)")
            }
        }
        
        queue.async(flags:.barrier) {
            print("all done")
        }
        
        print("\(#function) end")
    }
    
    func GroupWait() {
        print("\(#function)")
        
        let queue = DispatchQueue(label: "groupWaitTest")
        let group = DispatchGroup()
        
        for n in 1...100 {
            queue.async(group: group) {
                print("done \(n)")
            }
        }
        
        print("group.wait")
        let _ = group.wait(timeout: DispatchTime.distantFuture)
        
        
        print("\(#function) end")
    }
    
    func GroupNotify() {
        print("\(#function)")
        
        let queue = DispatchQueue(label: "GroupNotify")
        let group = DispatchGroup()
        
        for n in 1...100 {
            queue.async(group: group) {
                print("done \(n)")
            }
        }
        
        group.notify(queue: queue) {
            print("done")
        }
        
        print("\(#function) end")
    }
    
    func GroupEnterLeave() {
        print("\(#function)")
        
        let queue = DispatchQueue(label: "GroupNotify")
        let group = DispatchGroup()
        
        for n in 1...100 {
            group.enter()
            queue.async {
                print("done \(n)")
                group.leave()
            }
        }
        
        group.notify(queue: queue) {
            print("done")
        }
        
        print("\(#function) end")
    }
    
    func SemaphoExample() {
        
        print("\(#function)")
        
        let semapho = DispatchSemaphore(value: 0)
        
//        semapho.wait()

        DispatchQueue.global().async {
            for n in 1...100 {
                print("count \(n)")
            }
            
            semapho.signal()
        }
        
        
        print("wait")
        semapho.wait()
        
        
        print("\(#function) end")
    }

    


}