6

मुझे अपने उपयोगकर्ता का वर्तमान स्थान प्राप्त करने का एक तरीका चाहिए।आईफोन कोर स्थान आर्किटेक्चर - एकाधिक नियंत्रकों में इसका उपयोग कैसे करें

चूंकि किसी उपयोगकर्ता के मित्र हैं, और उनके पास स्थान डेटा भी है, हालांकि मुझे Friend और User इकाइयों में, मेरे कोर डेटा डीबी में स्थान फ़ील्ड डालने का सही तरीका है।

अब, यहाँ मैं क्या सोचा है:

स्थान प्रबंधक singelton किसी तरह का है, कि जब भी मैं सटीक स्थान की जरूरत है मैं उसे बताना CLLocationManager अपडेट शुरू करने के लिए। (जो मेरे प्रबंधक के लिए ज़िम्मेदार है) प्रबंधक डीबी में उपयोगकर्ता स्थान स्थान में स्थान सहेज लेगा, और उपयोगकर्ता में रुचि रखने वाले नियंत्रक। स्थान जानकारी उस डेटा पर केवीओ का उपयोग करके पंजीकरण करेगी। यह मेरे लिए अच्छा लगता है, इस तथ्य के अलावा कि मुझे इस स्थान को प्रत्येक नियंत्रक से सिंगलटन तक पहुंचना है, जिसके लिए सटीक स्थानों की आवश्यकता है (उसे स्थान उत्पन्न करने के लिए कहने के लिए, मैं नहीं चाहता कि स्थान अपडेट हर समय हो) । इसके अलावा मैं सिंगलटन कॉल के समूह के साथ अपने कोड को प्रदूषित न करने का प्रयास करता हूं।

मैं हालांकि यह समझदार हो सकता है शायद मेरी User वर्ग के भीतर एक संपत्ति के रूप में स्थान प्रबंधक है। (जाहिर है, अगर मैं स्मृति में कुछ उपयोगकर्ता है अभी, वे सभी एक ही स्थान प्रबंधक singelton साझा करेंगे) मैं उपयोगकर्ता वर्ग के लिए एक और तरीका जोड़ देगा और यह "StartGettingLocation" कहते हैं, और अब जब भी कुछ नियंत्रक वर्तमान सटीक स्थान की जरूरत है , वह निम्न में से एक कर सकते हैं:

  1. मेरी नियंत्रक में मैं एक उपयोगकर्ता वस्तु (जो अन्य UIViewController द्वारा साथ पारित किया गया था) है, तो मैं सिर्फ अपने 'StartGettingLocation "विधि और KVO उसके स्थान क्षेत्र कहते हैं।
  2. यदि मेरे पास मेरे नियंत्रक में कोई उपयोगकर्ता ऑब्जेक्ट नहीं है, तो मैं इसे अपने डीबी से प्राप्त करता हूं और उपरोक्त के रूप में करता हूं।

इस ध्वनि सही है?

यदि हां, तो मुझे क्या यकीन नहीं है, क्या मेरे उपयोगकर्ता वर्ग में MyLocationManager का नया सदस्य जोड़ना संभव है (जो प्रबंधित ऑब्जेक्ट पर उप-वर्ग है)? इसे पूरा करने का सही तरीका क्या है?

धन्यवाद

उत्तर

4

हम लागू हमारे CoreLocationManager एक sharedInstance (सिंगलटन) पैटर्न के रूप में। मुझे यकीन नहीं है कि आप अपनी प्रबंधित ऑब्जेक्ट को कोरलोकेशन व्यवहार के स्वामी के रूप में रखना चाहते हैं क्योंकि यह वास्तव में User के लिए विशिष्ट नहीं है, बल्कि एक डिवाइस (यानी, आईफ़ोन, आईपैड) है।

CoreLocationManager वास्तव में डेटाबेस रिकॉर्ड अपडेट नहीं करना चाहिए। इसका उद्देश्य अद्यतन स्थानों को भेजना है। इन अद्यतनों के लिए कुछ और सुनने की ज़रूरत है, इसलिए आप CLLocationManagerDelegate को कुछ और लागू कर सकते हैं, जो बदले में प्रबंधित ऑब्जेक्ट को अपडेट कर सकता है।

वैकल्पिक रूप से, आप अपने CoreLocationManager अपने स्वयं के प्रतिनिधि बन सकते हैं और CLLocation पर @property प्राप्त कर सकते हैं। पर्यवेक्षकों को सूचित करने के लिए आप केवीओ का उपयोग कर सकते हैं कि आपके द्वारा सुझाए गए स्थान को बदल दिया गया है। मुझे लगता है कि यह इस बात पर निर्भर करता है कि कोई स्थान किसी उपयोगकर्ता के लिए प्रासंगिक है या नहीं, या कोई स्थान ऐसा कुछ है जो कुछ भी उपयोग कर सकता है।

+0

मुझे नहीं लगता कि अपने CoreLocationManager स्थान अपडेट भेजने के लिए जिम्मेदार है है, कि सेब के CLLocationManager जिम्मेदारी है। मैं आपके कोरलोकेशन प्रबंधक को CLLocationManagerDelegate के अनुरूप होने की अपेक्षा करूंगा। फिर यह तय करेगा कि स्थान अपडेट के साथ क्या करना है, अगर इसे डीबी में सहेजना है या इसके साथ एक रिलावंट अधिसूचना पोस्ट करना है। और हां, स्थान केवल वर्तमान लॉग इन उपयोगकर्ता से संबंधित है, इसलिए अन्य नियंत्रक केवीओ बनाना उचित लगता है। उम्मीद है कि मैं आपको सही ढंग से समझ गया। – Idan

+0

आप सही हैं। हमारा CoreLocationManager स्थान अपडेट नहीं भेजता है, यह केवल 'CLLocationManager' के लिए एक रैपर है। हमारे पास प्रबंधक से CLLocationManager इंस्टेंस प्रारंभ/बंद करने के तरीके हैं। हम प्रबंधक पर CLLocation प्रॉपर्टी अपडेट करने के लिए CLLocationManagerDelegate को भी लागू करते हैं। क्षमा करें अगर मैंने यह स्पष्ट नहीं किया। –

+0

ठीक है, तो आप अन्य नियंत्रकों को स्थान परिवर्तन के बारे में कैसे पता चलेगा? क्या आप एक अधिसूचना पोस्ट करते हैं? आपके डीबी में बचाता है और इसे अन्य केवीओ देता है? – Idan

2

मैं आम तौर पर ऐप प्रतिनिधि की संपत्ति के रूप में अपना स्थान प्रबंधक डालता हूं, और फिर ऐप में कहीं भी [[[UIApplication sharedApplication] delegate] myLocationManager] के रूप में पहुंचना बहुत आसान है।यह भी अपने AppDelegate.h फ़ाइल की तरह में एक #define उपयोग करने के लिए आसान है ...

#define commonLocationManager [[[UIApplication sharedApplication] delegate] myLocationManager] 

इस तरह, आप बस किसी भी वर्ग आप commonLocationManager.someReallyCoolProperty साथ से स्थानों का उपयोग करने की जरूरत है अनुप्रयोग प्रतिनिधि हैडर शामिल हैं।

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

जब भी मैं अपने यूआई जरूरत स्थान में परिवर्तन, या उस बात के लिए किसी भी अन्य राज्य को प्रतिबिंबित करने के, मैं key-value observing (KVO) का उपयोग करें।