2015-01-13 15 views
6

मुझे यह त्रुटि मिल रही है जब मैं इस त्वरित पुस्तकालय (https://github.com/piemonte/player) का उपयोग करके एकाधिक वीडियो चलाने की कोशिश कर रहा हूं। सुनिश्चित नहीं है कि यह उस खिलाड़ी से संबंधित है, या फ़ोटो ढांचे या फिर क्या है।फोटो फ्रेमवर्क: परिसंपत्तियों के लिए कनेक्शन बाधित था या संपत्ति की मृत्यु हो गई

क्या होता है, मेरे पास एक ऐसा दृश्य है जो या तो एक फोटो या वीडियो प्रदर्शित करेगा। सब कुछ कुछ वीडियो ठीक होने तक ठीक काम करता है और फिर यह संदेश पॉप अप हो जाएगा, उसके बाद सभी वीडियो खेलने में सक्षम नहीं होंगे और उनके स्थान पर आप सिर्फ एक ब्लैक स्क्रीन देखेंगे, और फिर मुझे मेमोरी उपयोग त्रुटि मिल जाएगी।

मैं स्वाइप व्यू नामक लाइब्रेरी का उपयोग कर रहा हूं और यहां कुछ प्रासंगिक कोड है जो सहायक हो सकते हैं।

func swipeView(swipeView: SwipeView!, viewForItemAtIndex index: Int, reusingView view: UIView!) -> UIView! { 
    let asset: PHAsset = self.photosAsset[index] as PHAsset 

    // Create options for retrieving image (Degrades quality if using .Fast) 
    //  let imageOptions = PHImageRequestOptions() 
    //  imageOptions.resizeMode = PHImageRequestOptionsResizeMode.Fast 
    var imageView: UIImageView! 

    let screenSize: CGSize = UIScreen.mainScreen().bounds.size 
    let targetSize = CGSizeMake(screenSize.width, screenSize.height) 

    var options = PHImageRequestOptions() 
    options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
    options.synchronous = true 

    if (asset.mediaType == PHAssetMediaType.Image) { 
     PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: options, resultHandler: {(result, info) in 
      if (result.size.width > 200) { 
       imageView = UIImageView(image: result) 
      } 
     }) 

     return imageView 
    } else if (asset.mediaType == PHAssetMediaType.Video) { 
     self.currentlyPlaying = Player() 


     PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {result, audio, info in 
      self.currentlyPlaying.delegate = self 
      self.currentlyPlaying.playbackLoops = true 
      self.addChildViewController(self.currentlyPlaying) 
      self.currentlyPlaying.didMoveToParentViewController(self) 

      var t = result as AVURLAsset 
      var url = t.valueForKey("URL") as NSURL 
      var urlString = url.absoluteString 

      self.currentlyPlaying.path = urlString 
     }) 

     return self.currentlyPlaying.view 
    } 
    return UIView() 
} 


    func swipeViewItemSize(swipeView: SwipeView!) -> CGSize { 
    return self.swipeView.bounds.size; 
} 

func swipeView(swipeView: SwipeView!, didSelectItemAtIndex index: Int) { 
    self.currentlyPlaying.playFromBeginning() 
} 

func swipeViewCurrentItemIndexDidChange(swipeView: SwipeView!) { 
    self.currentlyPlaying.stop() 
} 

कोई भी विचार बहुत अच्छा होगा।

+1

ऐसा लगता है कि हर बार एक वीडियो खेला जाता है, तो आप एक नया 'प्लेयर()' बनाते हैं और इसे एक बच्चे दृश्य नियंत्रक के रूप में जोड़ते हैं। क्या आपने कभी इसे हटा दिया है? इससे स्मृति समस्याएं हो सकती हैं। – Jack

+0

@ जैकव्यू। ओह, शायद यह है। मैं उस पर एक नज़र डालेगा, धन्यवाद! – Jonovono

उत्तर

0

आपका समस्या हो सकती है कि आप एक नया प्लेयर-वस्तु हर बार एक वीडियो चलाना शुरू बनाने के लिए:

self.currentlyPlaying = Player() 

मैं तुम्हें बाद फ़ाइल समाप्त हो गया है खेलने की सलाह देते हैं या तो इसे दूर करने के लिए होगा या एक खिलाड़ी बनाने के लिए जो आप पुन: उपयोग करेंगे। अन्यथा यह memory.v

14

मेरे पास यह वही था "संपत्ति के लिए कनेक्शन बाधित था या संपत्ति की मृत्यु" त्रुटि हुई।

आमतौर पर स्मृति चेतावनी के बाद। मैंने चक्र बनाए रखने की कोशिश की, लेकिन यह नहीं था।

मेरे लिए समस्या जानते हैं कि resultHandler किसी भी PHImageManagerrequest...() की ब्लॉक नहीं मुख्य कतार पर कहा जाता है के साथ करना था।

इसलिए हम UIView कोड सीधे उन ब्लॉकों के भीतर नहीं चला सकते हैं, बिना ऐप जीवन में परेशानी के पूछे।

हम उदाहरण के लिए कर सकते हैं सब UIView कोड है कि अंदर resultHandler ब्लॉक के दायरे के भीतर निष्पादित किया जाएगा चलाने इसे ठीक करने के लिए एक dispatch_async(dispatch_get_main_queue(), block)

मैं इस समस्या हो रही थी क्योंकि मुझे लगता है कि में से एक का एहसास नहीं था जिन कार्यों को मैं परिणाम में से किसी एक के भीतर बुला रहा था, मेरे ऐप के हैंडलर। अंततः कुछ UIView लाइन को कोड पर कॉल किया गया। और इसलिए मैं मुख्य थ्रेड पर उस कॉल को अग्रेषित नहीं कर रहा था।

उम्मीद है कि इससे मदद मिलती है।

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