2016-10-22 4 views
6

की सामग्री प्राप्त करने के लिए कनेक्टिविटी, इंटरनेट या अन्यथा सामग्री नहीं है, तो मैं issue को हल करने का प्रयास कर रहा हूं, जहां फ़ीड पार्सिंग फ्रेमवर्क (FeedKit) क्रैश हो तो क्रैश हो निर्दिष्ट यूआरएल की सामग्री प्राप्त करने के लिए कोई कनेक्टिविटी नहीं है (उदाहरण के लिए ऐप ऑफ़लाइन है)।XMLParser का सबक्लास सामग्री के साथ क्रैश होता है अगर यूआरएल

तो, यह तब काम करता है जब ऐप ऑनलाइन होता है, और केवल ऑनलाइन।

जब भी मैं सुपर क्लास की सुविधा प्रारंभकर्ता XMLParser

convenience init?(contentsOf url: URL) 

ढांचे दुर्घटनाओं के साथ मेरी Parser वर्ग का दृष्टांत का प्रयास करें:

enter image description here

क्रम कोशिश करते हैं और समस्या को अलग करने के लिए, और ढांचे में पेश की गई कुछ त्रुटि को छोड़ दें, मैंने इस मुद्दे को एक स्वच्छ परियोजना में फिर से बनाया है:

एक समाधान है कि एक आकर्षण की तरह काम करता है, फाउंडेशन ढांचे के एक सादे वेनिला XMLParser का उपयोग कर:

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)") 
} 

और एक और है कि नहीं करता है:

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)") 
} 

दूसरे उदाहरण में, सब मैं कर रहा हूँ कर XMLParser वर्ग subclassing है। कोई ओवरराइड या कस्टम कोड जो भी हो। और यह अभी भी दुर्घटनाग्रस्त है।

क्या मुझे कुछ याद आ रही है?

धन्यवाद

संपादित करें:

इस मुद्दे पर संख्या 28,904,764 के साथ एप्पल के लिए एक बग रिपोर्ट प्रस्तुत और एक Radar खोला।

मुझे विश्वास है कि यह ऐप्पल के अंत में एक बग है, लेकिन गलत होना पसंद करेंगे और एक फिक्स होगा।

उत्तर

2

यह एक बग की तरह दिखता है।

हालांकि, अगर आप Parser में XMLParser वर्ग के नामित और सुविधा प्रारंभकर्ता ओवरराइड और अपने खुद के तर्क

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 
     } 
    } 
} 

को लागू करने और फोन के रूप में

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

मूल मुद्दे https://github.com/nmdias/FeedKit/issues/4 में एक अस्थायी समाधान के रूप में पहले से ही इस दृष्टिकोण का सुझाव दिया है।मैं ढांचे में प्रारंभकर्ता का एक कस्टम कार्यान्वयन प्रदान नहीं करना चाहता, क्योंकि यह सुपर की init के उद्देश्य को हरा देता है। इस बीच, ऐप्पल से क्रैश लॉग मांगने का जवाब मिला। अधिक प्रतिक्रिया प्राप्त करते समय अपडेट होगा। – nmdias

+0

@nmdias वैसे भी आप एक प्रश्न पोस्ट करके क्या जानने की कोशिश कर रहे थे? एक वैकल्पिक समाधान? –

+0

किसी समस्या का समाधान। मुझे लगता है कि एक कामकाज जितना अच्छा होगा उतना अच्छा होगा। मैं आपका जवाब स्वीकार करूंगा। – nmdias

-1

मुझे लगता है कि यह यूआरएल के साथ समस्या थी सकता है। मैंने आपके कोड की कोशिश की मुझे त्रुटि मिली।

Unable to read data 

मैं 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() 

यह सब ठीक काम करते हैं। (मैं स्विफ्ट 3 का उपयोग कर रहा हूं)

+0

मुझे यकीन नहीं है कि आप इस मुद्दे को दोहरा रहे हैं। आप NSURL का उपयोग क्यों कर रहे हैं? क्या वह स्विफ्ट 3 में है? और आपके कोड में XMLParser, वह क्या है? यह कहां परिभाषित किया जाता है? अगर यह स्विफ्ट 3 है, तो ऐसा लगता है कि आप सबक्लास का उपयोग नहीं कर रहे हैं। – nmdias

+0

हाँ ... इसका स्विफ्ट 3 –

+0

क्या आप XMLParser का उप-वर्ग उपयोग कर रहे हैं? – nmdias

संबंधित मुद्दे