Swift

2016-03-31 29 views
1

'da void işlevinde dispatch_async ve beklenmeyen boş-olmayan dönüş değeri appDelegate içinde kullanıcının geçerli konumunu döndüren bir işlev var.Swift

Şimdi başka yerde uyumsuz demek isterseniz ve yaptım:

func handleLocation() -> CLLocation { 
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    appDelegate.startGPS() 
    while (!appDelegate.isLocationFixed()) { 
     sleep(1) 
    } 
    dispatch_async(dispatch_get_main_queue()) { 
     return appDelegate.getLocation() 
    } 
    } 
} 

ama şimdi bu hat return appDelegate.getLocation() bana hata getiriyor: çok fazla bilmiyorum

unexpected non-void return value in void function

Swift ile ilgili konular için bu sorunu düzeltme konusunda bana yardımcı olabilir misiniz?

cevap

3

sorun

dispatch_async(dispatch_get_global_queue(priority, 0)) { 

ve

dispatch_async(dispatch_get_main_queue()) { 

aslında kapanışları/işlevleri oluştururken, bu yüzden içlerinde herhangi bir kod o işleve ilgili olacaktır değil

func handleLocation() -> CLLocation { 

olduğunu Eğer Bir işlev içinde asenkron bir işlem yapıyorsanız, asynchrono'dan sonra gerçekten bir dönüş ifadesi olamaz operasyon tamamlandı. Bunun yerine, işlevinizde bir tamamlama işleyicisi kullanmalısınız. örneğin:

İşte
func aSyncFunction(completionHandler: (AnyObject) ->()) { 

    //do async opporation 

    completionHandler("finished") // call the completion block when finished 
} 

Ben senin kullanım durumu için uygulamak gibi olacaktır:

func handleLocation(completionBlock: (CLLocation?) ->()) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

     guard let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate else { 
      dispatch_async(dispatch_get_main_queue()) { 
       completionBlock(nil) 
      } 
      return 
     } 
     appDelegate.startGPS() 
     while (!appDelegate.isLocationFixed()) { 
      sleep(1) 
     } 
     dispatch_async(dispatch_get_main_queue()) { 
      completionBlock(appDelegate.getLocation()) 
     } 
    } 
} 

örnek kullanımı:

handleLocation { (location: CLLocation?) in 
    if let location = location { 
     //use valid location 
    } 
} 
+0

Hmm yüzden sadece iç benim fonksiyonunun vücudu koyabilirsiniz aSyncFunction? Bana tam olarak nasıl yapabilirim? Kavramı burada alıyorum, emin değilim, teşekkürler! – randomuser1

+0

Kullanım durumunuz için bir örnek eklediyseniz, daha fazla sorunuz varsa bildirin. – PeejWeej

+0

Çok teşekkür ederim! Sadece xcode'uma yapıştırdım ve bu satırın yanında bir hata alıyorum: 'handleLocation {(location: CLLocation? Bu durumda tipik bir hata mı? – randomuser1