2017-03-12 1 views
-2

J'ai une classe Dispatch Central qui crée un timer écrit en swift 1.2. J'essaie de le convertir en Swift 3 mais je ne trouve pas le moyen de le réécrire en swift 3.Swift 3 - Aide Conversion GCD classe

Une aide pour ça?

class GCDTimer { 

    private var _timer : dispatch_source_t? 

    init() { 

    } 

    private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t 
    { 
     let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
     if (timer != nil) 
     { 
      dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC)/10); 
      dispatch_source_set_event_handler(timer, block); 
      dispatch_resume(timer); 
     } 
     return timer; 
    } 


    func start(interval : Double, block : (() -> Void)) 
    { 
     let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

     _timer = _createTheTimer(interval, queue: queue, block: block) 

    } 

    func stop() 
    { 
     if (_timer != nil) { 
      dispatch_source_cancel(_timer!); 
      _timer = nil; 
     } 
    } 
} 
+0

Trop large. Stack Overflow n'est pas un service de traduction. "Impossible de trouver le moyen de réécrire" n'est pas un vrai problème. "De l'aide avec ça?" Ce n'est pas une vraie question. Si vous avez des problèmes/erreurs spécifiques, renseignez-vous sur l'un d'entre eux. - En attendant, voici ma propre minuterie basée sur GCD; Sentez-vous libre de l'utiliser. https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk1ch12p499cancelableTimer/ch12p325NotificationLeaker/CancelableTimer.swift – matt

+0

@matt je vois que vous avez beaucoup de points liés iOS, pouvez-vous me dire ce qui ne va pas avec ma réponse? – silentBob

Répondre

-1

Ici, j'ai utilisé Xcode option de conversion pour elle:

Edition -> Convertir -> Pour Swift Current Syntaxe

class GCDTimer { 

    fileprivate var _timer : DispatchSource? 

    init() { 

    } 

    fileprivate func _createTheTimer(_ interval : Double, queue : DispatchQueue, block : (() -> Void)) -> DispatchSource { 
     let timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(rawValue: 0), queue: queue); 
     if (timer != nil) { 
      timer.setTimer(start: DispatchTime.now() + Double(Int64(interval * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC), interval: UInt64(interval * Double(NSEC_PER_SEC)), leeway: (1 * NSEC_PER_SEC)/10); 
      timer.setEventHandler(handler: block); 
      timer.resume(); 
     } 
     return timer as! DispatchSource; 
    } 


    func start(_ interval : Double, block : (() -> Void)) { 
     let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default); 

     _timer = _createTheTimer(interval, queue: queue, block: block) 

    } 

    func stop() { 
     if (_timer != nil) { 
      _timer!.cancel(); 
      _timer = nil; 
     } 
    } 
} 

Edit:

Après gruntwork;)

class GCDTimer { 

    var timer: DispatchSourceTimer? 
    init() { } 

    func startTimer(deadline: DispatchTime,interval: DispatchTimeInterval,queue: DispatchQueue, 
       leeway: DispatchTimeInterval, block : @escaping (() -> Void)) { 
     timer?.cancel() 
     timer = DispatchSource.makeTimerSource(queue: queue) 
     timer?.scheduleRepeating(deadline: deadline, interval: interval, leeway: leeway) 
     timer?.setEventHandler { 
     block() 
     } 
    timer?.resume() 
    } 

    func stopTimer() { 
     timer?.cancel() 
     timer = nil 
    } 
} 

Espoir thi s aide.

+0

Merci .. J'ai déjà essayé ceci mais ai toujours des erreurs sur les lignes – SNos

+0

erreur de 'timer.setTimer' – SNos

+0

Ouais, le convertisseur n'est pas parfait, de Swift 1 à 3 il y avait toujours gruntwork;) – silentBob