2017-01-01 9 views
0

Я обливание переполнения стека для возрастов пытается найти выход из этой ошибки:неожиданное не аннулируются возвращаемое значение в недействительной функции

unexpected non void return value in void function

, что я получаю с возвратом Bool в моей функции.

Я просто не могу выкапывать свой путь из этого. Я уверен, что это связано с асинксом, но я не очень хорошо разбираюсь в этих типах функций.

class CheckReachability { 


    class func setupReachability (hostName:String?, useClosures: Bool) -> Bool{ 

     var reachability : Reachability! 
     var connected = false 

       let reachability2 = hostName == nil ? Reachability() : Reachability(hostname: hostName!) 
       reachability = reachability2 
       try! reachability?.startNotifier() 

       if useClosures { 
        reachability2?.whenReachable = { reachability in 
         DispatchQueue.main.async { 
          connected = true 
          print("Reachable....") 
         } 
        } 
        reachability2?.whenUnreachable = { reachability in 
         DispatchQueue.main.async { 
          connected = false 
          print("Not Connected....") 
         } 
        } 

       } else { 
        NotificationCenter.default.addObserver(self, selector: Selector(("reachabilityChanged:")), name: ReachabilityChangedNotification, object: reachability2) 
       } 
      return connected 
      } 

} 

называют это из viewdidload на другой ВХ не позволяет достаточно времени, чтобы получить истинный результат

 let connected = CheckReachability.setupReachability(hostName: nil, useClosures: true) 
if connected { 
+1

Ваш код не дает мне эту ошибку. Проверить наличие неуравновешенного {} в коде не показано – Paulw11

+0

Что именно вы хотите достичь? Каждый раз, когда статус достижимости меняется, чтобы знать об этом? –

+0

Вы правы. Я слишком долго смотрел на это. Проблема, которую я сейчас имею, это инициализировать функцию из моего viewDidLoad в другом VC, не позволяя достаточно времени вернуть истинный результат. добавлена ​​информация о редактировании. – Pippo

ответ

1

Если вы хотите, чтобы написать класс проверки, чтобы прослушать достижимости, определить его как синглтон и передать completeBlock к нему так:

class CheckReachability { 

    static let shared = CheckReachability() 

    var reachability: Reachability? 

    func setupReachability(hostName:String?, completeBlock: ((Bool) -> Void)? = nil) { 

     reachability = hostName == nil ? Reachability() : Reachability(hostname: hostName!) 

     try? reachability?.startNotifier() 

     if let block = completeBlock { 
      reachability?.whenReachable = { reachability in 
       DispatchQueue.main.async { 
        print("Reachable....") 
        block(true) 
       } 
      } 
      reachability?.whenUnreachable = { reachability in 
       DispatchQueue.main.async { 
        print("Not Connected....") 
        block(false) 
       } 
      } 
     } else { 
      // If we don't use block, there is no point to observe it. 
      NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged(_:)), name: .ReachabilityChangedNotification, object: nil) 
     } 

    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 

    @objc func reachabilityChanged(_ notification: Notification) { 
     // ?? what should we do here? 
    } 

} 
+0

Спасибо за решение и извинения за непристойный оригинальный пост. Я смотрел на него часами, и я не думал четко. У меня возникли проблемы с пониманием подхода singleton и block block. я вижу, что вы хотите, чтобы что-то вроде этого запускалось один раз, а затем уведомляли, есть ли какие-либо изменения, но я не могу понять, как получить доступ к результатам из других классов? я собираюсь пойти по пути делегации здесь? – Pippo

+0

Первоначально я только что это вызвал из viewdidload в одном диспетчере представлений, и он всегда обновлял переменную, связанную с изменением соединения, которое затем позволило бы мне либо получать данные из сетевого или локального хранилища. – Pippo

+0

Вы можете взглянуть на эту библиотеку: https://github.com/Alamofire/Alamofire, она содержит NetworkReachabilityManager, чтобы помочь обнаружить Reachability. В вашем контроллере view объявите iVar этого класса (например, с именем 'manager'), затем вызовите' manager ?.startListening() 'и установите' manager? .listener = ... 'в свой' viewDidLoad', 'manager? .stopListening() 'on' deinit'. – bubuxu

2

Ваш вопрос сбивает с толку, потому что код размещен не ошибка, вы можете описать. Однако вы пытаетесь создать функцию, которая возвращает результат функции async. Это не так, как работает async.

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

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

@bubuxu предоставил вам код, показывающий, как изменить вашу функцию, как я описал.

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

  • Нет связанных вопросов^_^