2015-11-19 4 views
0

Я ищу способ запустить определенный бит кода, как только приложение запустится. Я пытаюсь сделать простой одноранговый чат-приложение, используя swiftSockets.код запуска при запуске приложения OSX

import Cocoa 
import CryptoSwift 

class MasterViewController: NSViewController { 

    @IBOutlet var msgField: NSTextField! 
    @IBOutlet var msgWindow: NSTextView! 

    let server:UDPServer = UDPServer(addr: "127.0.0.1", port: 5000) 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    func receive() { 
     let data = server.recv(1024) 
     let string = NSData.withBytes(data.0!) 
     let str = NSString(data: string, encoding: NSUTF8StringEncoding) as String? 
     msgWindow.string! += server.addr + " says: " + str! + "\n" 
    } 

    @IBAction func send(sender: NSButton) { 
     msgWindow.string! += "I said: " + msgField.stringValue + "\n" 
     msgField.stringValue = "" 
     server.send(str: msgField.stringValue) 
     let data = server.recv(1024) 
     let string = NSData.withBytes(data.0!) 
     let str = NSString(data: string, encoding: NSUTF8StringEncoding) as String? 
     msgWindow.string! += server.addr + " says: " + str! + "\n" 
    } 
} 

У меня есть код выше, посыл прекрасно работает, однако, как я могу получить функцию для запуска в фоновом режиме, как только получает, как приложение запускается?

ответ

0

Просто вызовите функцию приема в функции viewDidLoad() или viewDidAppear(). Для того, чтобы запустили его в фоновом режиме, рассмотрим dispatch_async() или dispatch_sync()

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    // do some tasks, in this case call receive() 
    dispatch_async(dispatch_get_main_queue()) { 
     // update some UI 
    } 
} 

Если вы просто хотите, чтобы запустить его периодически без необходимости передачи его на задний план, рассмотреть возможность использования NSTimer, и вызвать его scheduledTimerWithTimeInterval Подобная функция:

let timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "receive", userInfo: nil, repeats: true) 

с первым параметром является интервал в секундах, селектор функции вы хотите периодически вызывать (в данном случае приема).

+0

спасибо, быстрый вопрос. Будет ли я запускать dispatch_async() внутри viewDidLoad()? – bshah

+0

Да, dispatch_async() отправляет задачи, которые вы хотите использовать в фоновом режиме, поэтому неплохо было бы выполнить эту диспетчеризацию на первых этапах запуска вашего приложения, например, viewDidLoad(). –

Смежные вопросы