2016-10-22 1 views
6

Je tente de trier un issue où un cadre d'analyse de flux (FeedKit) se bloque s'il y a pas de connectivité pour obtenir le contenu de l'URL spécifiée (par exemple, l'application est hors ligne). Donc, cela fonctionne quand l'application est en ligne, et en ligne seulement.Sous-classe de XMLParser se bloque avec l'initialiseur contentsOfURL s'il n'y a pas de connectivité, Internet ou autre, pour obtenir le contenu de l'URL

Chaque fois que j'essaie de instancier ma Parser classe avec le initialiseur de commodité de la superclasse XMLParser

convenience init?(contentsOf url: URL) 

Les accidents cadres:

enter image description here

Afin d'essayer d'isoler le problème et exclure une erreur introduite dans le cadre, j'ai recréé le problème dans un projet propre:

Une solution qui fonctionne comme un charme, en utilisant un XMLParser vanilles du cadre Fondation:

let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss")! 

if let parser = XMLParser(contentsOf: feedURL) { // Works as expected 
    print("Got instance \(parser)") 
} 

Et un autre qui ne fait pas:

class Parser: XMLParser { } 

let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss")! 

if let parser = Parser(contentsOf: feedURL) { // Crash! 
    print("Got instance \(parser)") 
} 

Dans le second exemple, tout ce que je suis doing sous-classe la classe XMLParser. Aucun remplacement ou code personnalisé que ce soit. Et il se bloque toujours.

Ai-je raté quelque chose?

Merci

Edit:

a présenté un rapport de bug à Apple avec le numéro 28904764 et ouvert une Radar à cette question. Je suis confiant que c'est un bug sur la fin d'Apple, mais préférerait se tromper et avoir un correctif.

Répondre

2

Cela ressemble à un bug.

Cependant, vous pouvez remplacer le désigné et initialiseur commodité de XMLParser classe Parser et mettre en œuvre votre propre logique

class Parser: XMLParser { 
    override init(data: Data) 
    { 
     super.init(data: data) 
    } 

    convenience init?(contentsOf url: URL){ 
     //return data or null examining data from url 
     do{ 
      let data = try Data(contentsOf: url) 
      self.init(data: data) 

     }catch{ 
      return nil 
     } 
    } 
} 

Et appeler comme

let feedURL = URL(string: "http://images.apple.com/main/rss/hotnews/hotnews.rss") 
    if let parser = Parser(contentsOf: feedURL!){ 
     print("Got instance \(parser)") 
    }else{ 
     print("no data in url") 
    } 
+0

Déjà suggéré cette solution comme une solution temporaire dans le numéro d'origine https://github.com/nmdias/FeedKit/issues/4.Je ne souhaite pas fournir une implémentation personnalisée de l'initialiseur dans le framework, car cela va à l'encontre du but de l'init du super. Entre-temps, Apple a reçu une réponse demandant les journaux de plantage. Mettra à jour lorsque obtenir plus de commentaires. – nmdias

+0

@nmdias de toute façon qu'essayais-tu de savoir en postant une question? Une solution alternative? –

+0

Une solution à un problème. Je suppose qu'une solution de contournement est aussi bonne que ça va l'être. Je vais accepter votre réponse. – nmdias

-1

Je pense qu'il était le problème avec l'URL. J'ai essayé le code que j'ai eu l'erreur.

Unable to read data 

J'ai essayé de remplacer l'URL,

feedURL = NSURL(string:"http://images.apple.com/main/rss/hotnews/hotnews.rss#sthash.fuVEonEt.dpuf")! 
parser = XMLParser(contentsOf:feedURL as URL)! 
parser.delegate = self 
parser.parse() 

Il fonctionne tout va bien. (J'utilise Swift 3)

+0

Je ne suis pas sûr que vous reproduisiez le problème. Pourquoi utilisez-vous NSURL? Est-ce que c'est dans Swift3? Et le XMLParser dans votre code, qu'est-ce que c'est? Où est-ce défini? Si c'est Swift 3, il ne semble pas que vous utilisiez une sous-classe. – nmdias

+0

Oui ... son Swift 3 –

+0

Utilisez-vous une sous-classe de XMLParser? – nmdias