Создание инфиксного оператора с параметром

В настоящее время я пытаюсь упростить фоновый поток для выполнения основного потока в моем приложении.

Я делаю это следующим образом:

import Foundation

infix operator ~> {}

private let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

func ~> (backgroundClosure: () -> (), mainClosure: () -> ()) {
    dispatch_async(queue) {
        backgroundClosure()
        dispatch_async(dispatch_get_main_queue(), mainClosure)
    }
}

что позволило бы мне сделать что-то вроде:

{ println("executed in background thread") } ~> { println("executed in main thread") }

Теперь... Я хотел расширить эту функциональность, чтобы потенциально иметь возможность dispatch_after в основной поток, поэтому, возможно, я хочу, чтобы он вызывался на 0,25 секунды позже или что-то в этом роде.

Есть ли способ добиться этого, как-то передав параметр?

В идеале я мог бы реализовать что-то вроде backgroundClosure ~>(0.25) mainClosure, но я сомневаюсь, что это возможно


person David    schedule 14.10.2015    source источник


Ответы (2)


Просто предложение:

infix operator ~> {}

private let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

func ~> (backgroundClosure: () -> (), secondParam: (delayTime:Double, mainClosure: () -> () )) {
    // you can use the `delayTime` here
    dispatch_async(queue) {
        backgroundClosure()
        dispatch_async(dispatch_get_main_queue(), secondParam.mainClosure)
    }
}

Как использовать:

{ print("executed in background thread") } ~> (0.25, { print("executed in main thread") })
person t4nhpt    schedule 15.10.2015
comment
О, это действительно отличная идея. Я попробую. - person David; 16.10.2015

попробуй это:

private let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)

infix operator ~>{ associativity left precedence 140}

func ~> (backgroundClosure: ()->() , mainClosure: ()->()) {
dispatch_async(queue) { () -> Void in
    backgroundClosure()
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        mainClosure()
    })
}}
person Vandilson Lima    schedule 15.10.2015