2016-04-13 9 views
2

У меня возникли проблемы с использованием фоновой выборки на swift 2.0 согласно руководству ->https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial3. Я получаю эту ошибку: application: performFetchWithCompletionHandler: но обработчик завершения никогда не вызывался.IOS Firebase background fetch

В основном у меня есть функция, где я выполняю свои действия (вызывая данные на firebase), и я хочу, чтобы это выполнялось на фоне.

Вот мое приложение коды делегата

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(
    UIApplicationBackgroundFetchIntervalMinimum) 
} 


func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    if let tabBarController = window?.rootViewController as? UITabBarController, 
     viewControllers = tabBarController.viewControllers! as [UIViewController]! 
    { 
     for viewController in viewControllers { 

      if let a1 = viewController as? HorariosViewController { 
       completionHandler(.NewData) 
       a1.interface() 
      } 
     } 
    } 
} 

вот как я получаю данные из firebase на интерфейсной функции:

func interface() { 

       self.numeroDasOrações = [] 
       self.adhan = [] 

       if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] { 

        for snap in snapshots { 
         if let postDictionary = snap.value as? Dictionary<String, AnyObject> { 
          let key = snap.key 
          let hSalat = Horarios(key: key, dictionary: postDictionary) 
          let hAdhan = Horarios(key: key, dictionary: postDictionary) 

          self.numeroDasOrações.append(hSalat) 
          self.adhan.append(hAdhan) 

         } 
        } 
       } 
      }) 
} 

ошибка Xcode:

Предупреждения: Применение делегата получил вызов to -application: выполнитьFetchWithCompletionHandler: но обработчик завершения никогда не вызывался.

Заранее спасибо.

+0

Пожалуйста, покажите ваш код ... и точная ошибка/предупреждающее сообщение от XCode ... –

+0

@ kishan94 я просто отредактировал мой вопрос , –

+0

Я думаю, что вызов completeHandler должен быть завершенHandler (UIBackgroundFetchResult.NewData) – Jay

ответ

1

При использовании application(_:didReceiveRemoteNotification:) вы всегда должны вызывать обработчик завершения, несмотря ни на что. Политика Apple заключается в том, что вы вызываете completionHandler(.newData), если ваша выборка обнаружила новые данные, completionHandler(.noData), если ваша выборка не нашла новых данных и completionHandler(.failed), если ваша выборка обнаружила новые данные, но при попытке ее получить не удалось.

В вашем коде обработчик завершения вызывается только в том случае, если выполнены определенные условия. Вместо того, чтобы не вызывать обработчик завершения, вы должны позвонить completionHandler(.failed) или completionHandler(.noData).

Таким образом, окончательный код (обновляется Swift 3) будет:

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    var newData = false 
    if let tabBarController = window?.rootViewController as? UITabBarController, 
     viewControllers = tabBarController.viewControllers! as [UIViewController]! 
    { 
     for viewController in viewControllers { 
      if let a1 = viewController as? HorariosViewController { 
       newData = true 
       a1.interface() 
      } 
     } 
    } 
    completionHandler(newData ? .newData : .failed) // OR completionHandler(newData ? .newData : .noData) 
}