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") } }