2016-01-25 9 views
22

क्या मुझे 0xका उपयोग RXSwift subscribeNext बंद करने के भीतर करने की आवश्यकता है?'[कमजोर स्वयं]'

मैं कोड है:

searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { searchText in 
     self.viewModel.searchForLocation(searchText) 
    }.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag) 

मैं इतना है कि वहाँ बंद करने की शुरुआत में एक [weak self] कब्जा सूची है यह संशोधित करने की आवश्यकता है? इस तरह:

searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { [weak self] searchText in 
     self?.viewModel.searchForLocation(searchText) 
    }.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag) 
+0

इस पर निर्भर करता है कि आप स्वयं को कैप्चर करना चाहते हैं: कमजोर या दृढ़ता से। कमजोर चक्रों को तोड़ने का लाभ कमजोर है, हालांकि ... – Cristik

उत्तर

11

यदि बंद श्रेणी के स्वामित्व में नहीं है तो आपको [weak self] का उपयोग करने की आवश्यकता नहीं है।

इन-लाइन बंद होने के मामले में बंद होने की स्थिति कक्षा के स्वामित्व में नहीं है, लेकिन दायरे से यह तब होता है जब दायरा छोड़ा जाता है।

यदि बंद हो गया है तो यह कक्षा (स्वामित्व वाली संपत्ति) के स्वामित्व में हो सकता है या नहीं हो सकता है और यह [weak self] का उपयोग करने के लिए समझदार है, क्योंकि यह कक्षा के स्वामित्व में है।

+1

आपका उत्तर थोड़ा उलझन में है। अगर बंद करने का दायरा स्वामित्व में था, तो एक समारोह, उस समारोह को बंद करने के बाद बंद नहीं किया जाएगा। क्लोजर उस ऑब्जेक्ट के स्वामित्व में है जिसका आप निरीक्षण कर रहे हैं, उस स्थिति में 'searchBar'। इसलिए यदि किसी भी तरह 'स्वयं' को 'खोजबार' ओपी को मजबूत रेफरी है तो 'कमजोर' का उपयोग करना चाहिए – streem

0

आप [unowned self] या [weak self] उपयोग करने के लिए करता है, तो इस बात की प्रबल संदर्भ चक्र हो जाएगा चाहता हूँ। बंद होने के अंदर वेरिएबल बंद होने से "स्वामित्व" हो सकते हैं और बंद होने पर आसपास रहेंगे, इसलिए हम [unowned self] या [weak self] करते हैं।

6

हाँ, आप अगर तुम बंद करने के भीतर self का उपयोग self की एक कमजोर कब्जा बनाना चाहिए और यह संभव है selfnil बन सकता है कि बंद करने को कहा जाता है से पहले।

को बंद करने self कब्जा और फिर selfnil, जब बंद कहा जाता है हो जाता है और कि self तक पहुँचने के लिए प्रयास करता है, तो आप एक अपवाद मिल जाएगा।

क्रेडिट scotteg, वह GitHub पर एक उदाहरण परियोजना है: https://github.com/scotteg/TestRxSwiftClosures

DetailViewController देखें उदाहरण में।

परिणाम देखने के लिए आप एक ही समय में दो अन्य उदाहरणों को असम्बद्ध कर सकते हैं। पहला कैप्चर सूची परिभाषित नहीं करता है, और दूसरा unowned कैप्चर को परिभाषित करता है। ऐप चलाएं और कुछ टेक्स्ट दर्ज करें और 5 सेकंड के भीतर संपन्न टैप करें (प्रत्येक बंद में 5-सेकंड की देरी है)। पहले दो उदाहरणों के परिणामस्वरूप अपवाद फेंक दिए जाएंगे।

बुनियादी नियम यह है: कैप्चर (उदा, self) nil के लिए इस तरह अगर उदाहरण यह संदर्भ देता पुनः आवंटित की जाती हो जाता है के रूप में स्थापित किया जा सकता है, तो, weak के रूप में कब्जा परिभाषित करते हैं। अन्यथा, अगर बंद होने के भीतर एक बंद और कैप्चर हमेशा एक-दूसरे का संदर्भ लें और उसी समय हटा दिया जाए, तो कैप्चर को unowned के रूप में परिभाषित करें।

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