2016-07-29 25 views
1

Also weiß ich, dass dies ein bisschen spezifisch sein kann, aber ich starrte auf meinen Code und kann dieses Problem nicht lösen. Im Grunde mache ich einen Netzwerkanruf, um spotify zu erhalten, um eine bestimmte Wiedergabeliste zu erhalten und eine Zahl zu übergeben, die schließlich die Anzahl der Lieder bestimmt, die ich zurückbekomme. Der Code ist im Grunde wie folgt:Unerwarteterweise Auspacken eines optionalen, um ein Nil nach einem API-Aufruf an Spotify zu finden

// A network call is made just above to return somePlaylist 
    let playlist = somePlaylist as! SPTPartialPlaylist  
    var songs: [SPTPartialTrack] = [] 

    // load in playlist to receive back songs 
    SPTPlaylistSnapshot.playlistWithURI(playlist.uri, session: someSession) { (error: NSError!, data: AnyObject!) in 

     // cast the data into a correct format 
     let playlistViewer = data as! SPTPlaylistSnapshot 
     let playlist = playlistViewer.firstTrackPage 

     // get the songs 
     for _ in 1...numberOfSongs { 
      let random = Int(arc4random_uniform(UInt32(playlist.items.count))) 
      songs.append(playlist.items[random] as! SPTPartialTrack) 
     } 
    } 

Das Problem kommt in dem Teil des Codes, der zufällige initialisiert. In vielleicht 1 von 20 Aufrufen dieser Funktion entwerfe ich aus irgendeinem Grund einen Nullwert für playlist.items.count und kann nicht herausfinden, warum. Vielleicht verstehe ich etwas nicht von API-Anrufen oder etwas anderem, das ich nicht sehen kann, aber ich kann es nicht verstehen.

Jeder hat irgendwelche Empfehlungen zur Behebung dieses Problems oder zur Fehlerbehebung?

Antwort

0

Ok, nachdem ich darauf geschlafen und daran gearbeitet habe, scheint mir das Problem gelöst zu sein. Hier ist die Fehlerbehandlung, die ich in meinen Code implementiert habe.

if let actualPlaylist = playlist, actualItems = actualPlaylist.items { 
     if actualItems.count == 0 { 
      SongScraper.playlistHasSongs = false 
      print("Empty playlist, loading another playlist") 
      return 
      } 

     for _ in 1...numberOfSongs { 
      let random = Int(arc4random_uniform(UInt32(actualItems.count))) 
      songs.append(actualPlaylist.items[random] as! SPTPartialTrack) 
     } 

     completionHandler(songs: songs) 
    } 
    else { 
     print("Returned a nil playlist, loading another playlist") 
     SongScraper.playlistHasSongs = false 
     return 
    }