2016-02-01 2 views
3

Я создаю простую заставку для OSX и хочу создать поток для некоторых фоновых вычислений.OSX: Создание потока в заставке

Я нашел эту функцию здесь в SO, который будет создавать поток через Х секунд:

func backgroundThread(delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) { 
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { 
     if(background != nil){ background!(); } 

     let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) 
     dispatch_after(popTime, dispatch_get_main_queue()) { 
      if(completion != nil){ completion!(); } 
     } 
    } 
} 

Но это, кажется, не работает, когда я добавляю его в init:

override init?(frame: NSRect, isPreview: Bool) { 
    super.init(frame: frame, isPreview: isPreview); 
    let fontSize: CGFloat = 20; 
    let frameHeight: CGFloat = self.frame.size.height; 
    let font = NSFont(name: "Times New Roman", size: fontSize); 
    let paragraph = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle; 
    paragraph.alignment = NSTextAlignment.Center; 
    let textColor = NSColor(calibratedRed: 255.0, green: 255.0, blue: 255.0, alpha: 1.0); 

    self.backgroundThread(3.0, background: { 

     let w:String = "test"; 
     let textRect: NSRect = NSMakeRect(1, (frameHeight-CGFloat(fontSize*CGFloat(1))-30), 80, 30); 
     if let actualFont = font { 
      let textFontAttributes = [ 
       NSFontAttributeName: actualFont, 
       NSForegroundColorAttributeName: textColor, 
       NSParagraphStyleAttributeName: paragraph 
      ]; 

      w.drawInRect(NSOffsetRect(textRect, 0, 1), withAttributes: textFontAttributes); 
     } 
    }); 
} 

It должен отображать эту строку через 3 секунды в другом потоке, но это не так. Что мне не хватает?

ответ

1

ГИП нить должна быть основной поток, а не фон один

Поэтому использовать закрытие завершающие

self.backgroundThread(3.0, completion: { 

Или использовать только необходимый код

dispatch_after(3.0, dispatch_get_main_queue()) { 
    ... 
} 

Или использовать структуру подобные Eki