Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Ruby風Swift
NSOperation編
藤本尚邦 2014年11月15日
Swiftの関数呼び出しで引数に
ブロックを渡すときの
シンタックスシュガーが自由すぎるせいで
Ruby風に書きたくなる病、通称
Ruby脳
に冒されそうです
作ってるアプリの簡単な紹介
HTTP GETして結果を表示する流れを
NSOperationで非同期実行するコード
private func getFirstPage() {
items.removeAll(keepCapacity: false)
indicator.s...
HTTP GETして結果を表示する流れを
NSOperationで非同期実行するコード
private func getFirstPage() {
items.removeAll(keepCapacity: false)
indicator.s...
NSBlockOperationを
普通に使うとこんな感じ
let operation = NSBlockOperation(block: {
...
})
operationQueue.addOperation(operation)
( □の...
Swiftのシンタックスシュガー その1
ブロック引数は引数リストの
括弧の外に追い出せる
let operation = NSBlockOperation() {
...
}
operationQueue.addOperation(opera...
Swiftのシンタックスシュガー その2
他に引数がないときは括弧を省略できる
let operation = NSBlockOperation {
...
}
operationQueue.addOperation(operation)
この構文を考えた人や
採用に賛成した人は多分
Ruby脳
operationを作ってqueueに入
れる流れはパターン化している
let operation = NSBlockOperation {
...
}
operationQueue.addOperation(operation)
これをRuby脳で
眺めていると
let operation = NSBlockOperation {
...
}
operationQueue.addOperation(operation)
operationQueue.addOperation {
...
}
addOperationに直接ブロッ
クを渡せればいいじゃん
operationQueue.addOperation {
...
}
となります
そこでextension登場
NSOperationQueueに
addOperationの
ブロック渡しバージョンを追加したった
extension NSOperationQueue {
func addOperation(#block: ()->()) {
let op...
このコードが…
private func getFirstPage() {
items.removeAll(keepCapacity: false)
indicator.startAnimating()
let operation = NSBl...
こんな風になって
Ruby脳大満足
private func getFirstPage() {
items.removeAll(keepCapacity: false)
indicator.startAnimating()
operationQ...
(ついでに)ブロックの最後で呼んでいる
displaySearchResultは結果をGUIに反映させ
るメソッドなんですが…
private func getFirstPage() {
...
operationQueue.addOperat...
GUIを処理するoperationを
mainQueueに放り込んでます
private func displaySearchResult() {
NSOperationQueue.mainQueue().addOperation {
self...
あなたもRuby脳に
なってみませんか?
以上です
どうもありがとう
ございました
Upcoming SlideShare
Loading in …5
×

Ruby風Swift NSOperation編

1,012 views

Published on

Swift の関数呼び出しでブロック引数のシンタックスシュガーがRubyっぽいので、それを使って NSOperationQueue を少しだけ拡張すると、非同期処理の典型的なパターンが簡潔に書けるようになりコードが読みやすくなりますよ。

Published in: Software
  • Be the first to comment

Ruby風Swift NSOperation編

  1. 1. Ruby風Swift NSOperation編 藤本尚邦 2014年11月15日
  2. 2. Swiftの関数呼び出しで引数に ブロックを渡すときの シンタックスシュガーが自由すぎるせいで Ruby風に書きたくなる病、通称 Ruby脳 に冒されそうです
  3. 3. 作ってるアプリの簡単な紹介
  4. 4. HTTP GETして結果を表示する流れを NSOperationで非同期実行するコード private func getFirstPage() { items.removeAll(keepCapacity: false) indicator.startAnimating() let operation = NSBlockOperation(block: { if let searchResult = callSearchApi(self.keyword) { self.currentPage = searchResult.currentPage self.pageCount = searchResult.pageCount for item in searchResult.items { self.items.append(item) } } self.displaySearchResult() }) operationQueue.addOperation(operation) }
  5. 5. HTTP GETして結果を表示する流れを NSOperationで非同期実行するコード private func getFirstPage() { items.removeAll(keepCapacity: false) indicator.startAnimating() let operation = NSBlockOperation(block: { if let searchResult = callSearchApi(self.keyword) { self.currentPage = searchResult.currentPage self.pageCount = searchResult.pageCount for item in searchResult.items { self.items.append(item) } } self.displaySearchResult() }) operationQueue.addOperation(operation) }
  6. 6. NSBlockOperationを 普通に使うとこんな感じ let operation = NSBlockOperation(block: { ... }) operationQueue.addOperation(operation) ( □の内側がブロック )
  7. 7. Swiftのシンタックスシュガー その1 ブロック引数は引数リストの 括弧の外に追い出せる let operation = NSBlockOperation() { ... } operationQueue.addOperation(operation)
  8. 8. Swiftのシンタックスシュガー その2 他に引数がないときは括弧を省略できる let operation = NSBlockOperation { ... } operationQueue.addOperation(operation)
  9. 9. この構文を考えた人や 採用に賛成した人は多分 Ruby脳
  10. 10. operationを作ってqueueに入 れる流れはパターン化している let operation = NSBlockOperation { ... } operationQueue.addOperation(operation)
  11. 11. これをRuby脳で 眺めていると let operation = NSBlockOperation { ... } operationQueue.addOperation(operation)
  12. 12. operationQueue.addOperation { ... }
  13. 13. addOperationに直接ブロッ クを渡せればいいじゃん operationQueue.addOperation { ... } となります
  14. 14. そこでextension登場
  15. 15. NSOperationQueueに addOperationの ブロック渡しバージョンを追加したった extension NSOperationQueue { func addOperation(#block: ()->()) { let operation = NSBlockOperation { block() } self.addOperation(operation) } }
  16. 16. このコードが… private func getFirstPage() { items.removeAll(keepCapacity: false) indicator.startAnimating() let operation = NSBlockOperation(block: { if let searchResult = callSearchApi(self.keyword) { self.currentPage = searchResult.currentPage self.pageCount = searchResult.pageCount for item in searchResult.items { self.items.append(item) } } self.displaySearchResult() }) operationQueue.addOperation(operation) }
  17. 17. こんな風になって Ruby脳大満足 private func getFirstPage() { items.removeAll(keepCapacity: false) indicator.startAnimating() operationQueue.addOperation { if let searchResult = callSearchApi(self.keyword) { self.currentPage = searchResult.currentPage self.pageCount = searchResult.pageCount for item in searchResult.items { self.items.append(item) } } self.displaySearchResult() } }
  18. 18. (ついでに)ブロックの最後で呼んでいる displaySearchResultは結果をGUIに反映させ るメソッドなんですが… private func getFirstPage() { ... operationQueue.addOperation { ... self.displaySearchResult() } }
  19. 19. GUIを処理するoperationを mainQueueに放り込んでます private func displaySearchResult() { NSOperationQueue.mainQueue().addOperation { self.tableView.reloadData() self.indicator.stopAnimating() } }
  20. 20. あなたもRuby脳に なってみませんか?
  21. 21. 以上です どうもありがとう ございました

×