2016-04-11 13 views
0

Bir tabloya aktarılan verileri almak için bir arama alanına sahip çok basit bir uygulama yapıyorum.swift shouldPerformSegueWithIdentifier veri alın async

Yapmak istediğim, verileri almak için bir Async görevi çalıştırıyor ve veriler başarılı bir şekilde getirilirse sonraki görünüme gider, yükleme sırasında ekranın asenkron bölümünün neden gerekli olduğunu dondurmaması gerekir. kullanıcı Aradüğmesine basıldığında

benim

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { 

yöntemde verileri almak için aşağıdaki kodu çalıştırın.

var valid = true 
    let searchValue = searchField.text 
    let session = NSURLSession.sharedSession() 

    let url = NSURL(string: "https://someapi.com/search?query=" + searchValue!) 



    let task = session.dataTaskWithURL(url!, completionHandler: {(data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
     if let theData = data { 
      dispatch_async(dispatch_get_main_queue(), { 
       //for the example a print is enough, later this will be replaced with a json parser 
       print(NSString(data: theData, encoding: NSUTF8StringEncoding) as! String) 

      }) 
     } 
     else 
     { 
      valid = false; 
      print("something went wrong"); 
     } 
    }) 

    UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
    task.resume() 
    return valid; 

G/bağlantı için denetler uygulama kodu daha okunabilir hale getirmek için veriyi yükleyen göstermek için metinleri değiştirir bazı kodlar kaldırıldı. Bu benim ne olur onu (görünüm yüklenir çünkü bu görebilir) true döndürür vb bağlantısı

var bu kısmında tüm kontrolleri sonra gelir ve emin im, ben sorun var parçasıdır ama aynı zamanda "bir şey ters gitti" diye yazıyor.

Anladım çünkü geçerli (geçerli satırdaki geçerli) geçerli olarak geçerli olan geri dönüş geçerli olarak false değerine ayarlanmış. Veriler başarılı bir şekilde getirilirse ve bir şeylerin yanlış gitmesi durumunda sonraki görünümü göstermiyorsa yalnızca doğru (nasıl görünümü değiştirir) döndürürüm?

+4

Bunu 'shouldPerformSegueWithIdentifier:' içinde yapamazsınız. Segue'i gerçekleştirmeye çalışmadan önce arama yapın ve "performSegueWithIdentifier:" işlevini çağırın ve eğer çağrı geri dönerse ve – dan

+0

@dan yazmanız gerektiğini söylerse, "neden" sholuldPerformSegueWithIdentifier ile ilgili elma dokümanlarından değil "Belirtilen tanıtıcıya sahip segenin gerçekleştirilip gerçekleştirilmeyeceğini belirler." , tam olarak doğru yapmak istediğim şey bu mu? –

+0

Evet, ancak bu kararı eşzamansız olarak yapamazsınız, hemen bir değer döndürmeniz gerekiyor. – dan

cevap

1

Veri getirmenin zaman uyumsuz olmasını istediğiniz için bir değer döndüremiyorsunuz çünkü bir değer döndürme senkronize oluyor (geçerli iş parçacığı işlev döndürene kadar beklemeli ve sonra değeri kullanmalıdır). Bunun yerine, bir geri arama kullanmaktır. Böylece veriler getirildiğinde bir işlem yapabilirsiniz.

func shouldPerformSegue(identifier: String, sender: AnyObject?, completion:(success:Bool) ->()); 

Ve sadece başarılı olup, olmadığına bağlı olarak session.dataTaskWithURL blokta completion(true) veya completion(false) diyoruz ve size işlevini çağırdığınızda completion için bir blok vermek: En yöntemi olurdu böylece Bunun için kapanışları kullanabilirsiniz segue'yi gerçekleştirebileceğiniz veya success parametresini temel alarak gerçekleştirebileceğiniz. Bu, ihtiyacınız olan şeyi yapmak için override'u kullanamazsınız demektir, kendi mekanizmanızı uygulamanız gerekir.

+1

shouldPerformSegue, işletim sisteminin bir segenin gerçekleştirilip gerçekleştirilmeyeceğini belirlemenizi istediği isteğe bağlı bir sistem işlevidir. Böyle bir sistem işlevine geri arama kapatma ekleyemezsiniz. –

+0

Ohh, haklısın. Ancak async görevi nedeniyle hala bir tür geri çağırma gereklidir. – Jelly