"सभी participants.username =% @" किसी एप्लिकेशन को प्राप्त करने से
तो, सभी वार्तालापों, जिसमें एक विशेष उपयोगकर्ता भाग लिया, तो आप एक विधेय समान के साथ "प्रतिभागी" पर लाने की तरह कुछ कर सकता है पाने के लिए है कि बिल्कुल वही बात करता है, यहां मेरी अंतर्दृष्टि हैं।
सबसे पहले आपको कोडिंग से पहले कॉर्डेटा और मल्टीथ्रेडिंग बुद्धिमानी पर विचार करना चाहिए। अगर आपको उस पर मदद की ज़रूरत है तो मुझे बताएं।
मॉडल
आप CoreData में संस्थाओं, जो SQLite में तालिकाओं की तरह माना जा सकता है के साथ काम कर रहे हैं, लेकिन एक और अधिक सार तरीके से। इसके लिए आपको review Apple's documentation होना चाहिए।
हम आपके मामले में कम से कम तीन अलग-अलग इकाइयां पा सकते हैं: उपयोगकर्ता, वार्तालाप, और संदेश। (आखिरी के साथ सावधान रहें, मुझे एसएमएस फ्रेमवर्क आयात करते समय संदेश नामक इकाई के साथ कोई समस्या थी, आपको इकाई के नाम को उपसर्ग करने पर विचार करना चाहिए ..)
कोर्डटा के साथ एक मुद्दा यह है कि आप सीधे स्टोर नहीं कर सकते सरणी (कुछ अज्ञात प्रकार के साथ हो सकता है) लेकिन वैसे भी। तो दो समाधान अपने उपयोगकर्ताओं को स्टोर करने के लिए:
Conversation{
messages<-->>Message.conversation
lastMessage<-->Message.whateverName
//optional
users<<-->>User.conversation
}
Message{
conversation<<-->Conversation.messages
whatevername<-->Conversation.lastmessage // "whatever as it does not really matter"
}
User{
conversations<<-->>Conversation.users
}
: या तो एक NSString .. जब वे comas और एक साधारण regex या विभाजन आप उपयोगकर्ताओं की संख्या दे देंगे से सीमांकित किया जाएगा
तो अपने मॉडल की तरह लग सकता है
वार्तालाप में संदेश और संदेश के साथ एक से अधिक संबंध होना चाहिए बातचीत के लिए एक-एक रिश्ते।
--EDIT
तुम सिर्फ संदेश अनुप्रयोग (या मेरे एप्लिकेशन) की तरह एक बातचीत का अंतिम संदेश प्रदर्शित करना चाहते हैं, तो आप संदेश के साथ एक रिश्ता जोड़ सकते हैं। यह डेटाबेस/coredata में संदेश दो बार संग्रहीत नहीं करेगा। दरअसल, आप एक कोर्डाटा ऑब्जेक्ट बनाते हैं (इस मामले में एक संदेश) और आप इसे एक वार्तालाप में जोड़ते हैं, अंदर क्या होता है कि वार्तालाप उस ऑब्जेक्ट के लिए कॉर्डेटा आईडी संग्रहीत करता है। इस संदेश (lastMessage) के लिए एक रिश्ते जोड़ना केवल एक और आईडी स्टोर करेगा, न कि कोई अन्य वस्तु।
संपादित
उपयोगकर्ता की --end थोड़ा अलग है क्योंकि वे (समूह वार्तालाप की वजह से) से अधिक वार्तालापों का हिस्सा हो सकता है यही कारण है कि आप एक बहुत-से-अनेक संबंध जहाज की जरूरत है।
आप जितनी चाहें उतनी विशेषताओं को जोड़ सकते हैं, लेकिन यह न्यूनतम आवश्यकता है!
- कार्यान्वयन
अपने कोड में तो
, अगर आप iMessage के व्यवहार की नकल करना चाहते हैं, यहाँ मैं क्या किया है:
पहले नियंत्रक, जहां आप सभी वार्तालाप देख सकते हैं में
: एक NSFetchedResultController का उपयोग करें। क्वेरी केवल इकाई वार्तालाप के बारे में होना चाहिए।
पंक्ति पर क्लिक करते समय, मैंने जो किया वह यह है कि नए दृश्य में वार्तालाप वस्तु और अन्य NSFtechedResultController है। मैं फिर केवल इकाई संदेश से पूछता हूं लेकिन भविष्यवाणी के साथ कि मैं केवल यह वार्तालाप चाहता हूं।
आप तरलता को देखने के लिए मेरे ऐप की जांच करना चाहते हैं, तो go to this link.
संपादित
- कोड स्निपेट बातचीत का अंतिम संदेश
खोजने के लिए सावधान: यह ऐसा करने का एक बेहतर तरीका खोजने से पहले एक अस्थायी उत्तर है (यानी जब प्राप्ति गुणों का उपयोग करते हैं)
NSFetchRequest * req = [[NSFetchRequest alloc] init];
[req setEntity:[NSEntityDescription entityForName:@"Message" inManagedObjectContext:context]];
[req setPredicate:[NSPredicate predicateWithFormat:@"conversation == %@", self]]; /* did that from a Conversation object.. */
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"sent_date" ascending:NO];
[req setSortDescriptors:[NSArray arrayWithObject:sort]];
[sort release];
NSError * error = nil;
NSArray * messages = [context executeFetchRequest:req error:&error];
[req release];
if ([messages count] > 0) { /* sanity check */
return [messages objectAtIndex:0];
}
return nil;
संपादित की --end
आशा इस मदद!
पियरे
मैं आपके सुझाव के साथ गया, लेकिन वार्तालाप सूची पढ़ते समय - मुझे वहां दिखाने के लिए अंतिम संदेश कैसे मिलता है (जैसा कि आपने "संदेश" स्क्रीन में किया था)। धन्यवाद। –
हाय गिलाद मैंने थोड़ा जवाब दिया। मूल रूप से, केवल अंतिम मैसेज या जो कुछ भी आप चाहते हैं उसे एक-से-एक संबंध जोड़ें। हर बार जब आप एक नया संदेश/delete_the_last_one प्राप्त करते हैं, तो बस अंतिम संदेश फ़ील्ड को अपडेट करें। यदि आप अतिरिक्त संबंध जोड़ने के प्रशंसक नहीं हैं, तो आप मुझे अंतिम संदेश खोजने के लिए प्रत्येक बातचीत के लिए NSFetchRequest में खोदने का अनुमान लगा सकते हैं, लेकिन यह बहुत खराब हो सकता है, प्रदर्शन के अनुसार। आशा है कि – Pierre
धन्यवाद बहुत धन्यवाद पियरे - यही वह है जो मैंने अंततः किया था। संदेश हटाने पर मुझे थोड़ी सी समस्या है (मुझे अब नवीनतम संदेश मैन्युअल रूप से पहचानने और मेरी वार्तालाप वस्तु को अपडेट करने की आवश्यकता है), लेकिन कम से कम मुझे इतिहास ठीक से मिलता है। धन्यवाद!!! –