2015-02-17 4 views
0

Я пишу приложение в Swift, где я внедрил singleton class обработку данных с помощью Moscapsule.Как вызвать completeHandler из класса Singleton?

Когда я сообщаю мое приложение, что есть новые данные с content-available: 1 правой функция вызывается, где я в настоящее время только делаю

let mqtt = MQTTManager.Instance 
completionHandler(UIBackgroundFetchResult.NewData) 

Менеджер создает соединение по инициализации и в onMessageCallback затем работает с новым данные.

Если приложение запустилось недавно, оно находится в фоновом режиме, а одноэлементный класс поддерживает сетевое соединение, это работает. Но это неправильный путь.

Я очень новичок в разработке iOS и Swift, как я могу подождать максимальное количество времени? Когда данные поступают, я могу отправить UIBackgroundFetchResult.NewData, если ничего не произойдет, я могу отправить UIBackgroundFetchResult.Failed.

Моя первая идея заключалась в том, чтобы написать цикл, проверяющий переменную из этого класса, если новое сообщение появилось за каждые 500 мс, и если да, вызовите метод завершенияHandler. Но мне это не кажется правильным, и что бы вы сделали?

EDIT 2015/02/18: Heres код из моего AppDelegate.swift, который запускается на выполнение после того, как приложение получает беззвучный толчок уведомление:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    log.debug("Got remote notification: \(userInfo)") 
    log.debug("Setting up MQTT client...") 
    let mqtt = MQTTManager.sharedInstance 
    completionHandler(UIBackgroundFetchResult.NewData) 
} 
+0

Нет, на самом деле это 'didReceiveRemoteNotification' с' fetchCompletionHandler', но я думаю, что это не так важно. Проблема заключается в том, что внутри onMessageCallback xcode не знает, что такое completeHandler («Использовать неразрешенный идентификатор», если быть точным). – meilon

ответ

1

Вы могли бы определить свойство в пределах этого класса удерживать обработчик завершения (что делает это по желанию):

var completionHandler: ((UIBackgroundFetchResult) -> Void)? 

Тогда ваш didReceiveRemoteNotification бы сделать что-то вроде:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    log.debug("Got remote notification: \(userInfo)") 
    log.debug("Setting up MQTT client...") 
    let mqtt = MQTTManager.sharedInstance 
    mqtt.completionHandler = completionHandler 
} 

Затем onMessageCallback мог тогда сделать что-то вроде:

self.completionHandler?(.NewData) // or .NoData or whatever 
self.completionHandler = nil 

Я должен признаться, что это не так. Похоже, функция init не только создает экземпляр одноэлементного, но и начинает соединение, делая запрос, что у вас есть. Вы не поделились ею с нами, так что трудно сказать, но это кажется неправильным. init действительно должен создавать только одноэлемент. Затем настроим его (например, укажите completionHandler), и только тогда он вызовет отдельную функцию connect.

+0

Спасибо за код! Вы правы в инициализации, я переписал эту часть, так что только после того, как я установил переменную-обработчик завершения класса, я инициирую подключение и извлечение данных через отдельную функцию класса менеджера Еще раз спасибо! – meilon

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