के साथ सिंगलटन सिंक्रनाइज़ेड सरणी का उपयोग करना मेरे पास एक यूआईएसearchBar के साथ एक पुस्तक ऐप है, जहां उपयोगकर्ता किसी भी पुस्तक का नाम टाइप करता है और जैसा कि वह टाइप करता है, नीचे खोज परिणाम (ext API कॉल से) प्राप्त करता है।एनएसटीएचएड
मैं अपने ऐप में एक सिंगलटन वैरिएबल का उपयोग कर रहा हूं जिसे पुनर्प्राप्त किया गया है, जो सभी पुस्तकों को स्टोर करता है।
@interface Shared : NSObject {
NSMutableArray *books;
}
@property (nonatomic, retain) NSMutableArray *books;
+ (id)sharedManager;
@end
यह एनएसएमयूटेबलएरे * पुनर्प्राप्त आरे का उपयोग कर एकाधिक .m फ़ाइलों में उपयोग किया जाता है; ... हेडर फाइल
retrievedArray = [[Shared sharedManager] books];
में मेरे सवाल यह है कि मैं सुनिश्चित करते हैं कि retrievedArray अंदर मान सभी वर्गों में सिंक्रनाइज़ रहते है।
दरअसल पुनर्प्राप्त किए गए मूल्यों को एनआरएक्सएमएलपार्सर (यानी बाहरी वेब सेवा एपीआई के माध्यम से) के माध्यम से जोड़ा जाता है। एक अलग XMLParser.m फ़ाइल है, जहां मैं सभी पार्सिंग करता हूं और सरणी भरता हूं। पार्सिंग एक अलग धागे पर किया जाता है।
- (void) run: (id) param {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]];
[parser setDelegate: self];
[parser parse];
[parser release];
NSString *tmpURLStr = [[self URL]absoluteString];
NSRange range_srch_book = [tmpURLStr rangeOfString:@"v1/books"];
if (range_srch_book.location != NSNotFound)
[delegate performSelectorOnMainThread:@selector(parseDidComplete_srch_book) withObject:nil waitUntilDone:YES];
[pool release];
}
- (void) parseXMLFile: (NSURL *) url
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self setURL: url];
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(run:)
object: nil];
[retrievedArray removeAllObjects];
[myThread start];
[pool release];
}
यदि उपयोगकर्ता प्रकार बहुत जल्दी (यह अगर धीरे धीरे उपयोगकर्ता प्रकार ठीक काम कर रहा है) कुछ तुल्यकालन मुद्दों होने के लिए वहाँ लगता है .... तो वहाँ 2 दृश्य हैं जिसमें में एक वस्तु की सामग्री यह साझा सरणी आइटम प्रदर्शित होता है; सूची और विवरण। यदि उपयोगकर्ता ए में सूची दृश्य पर तेज़ और क्लिक करता है, तो उसे बी को विस्तार से देखा गया है ... यह मुख्य मुद्दा है।
मैंने सचमुच उन सभी समाधानों का प्रयास किया है जिनके बारे में मैं सोच सकता हूं, लेकिन अभी भी इस मुद्दे को ठीक करने में असमर्थ हूं।
सिंक इश्यू उदाहरण के लिए संपादन: सूची दृश्य में, यदि आइटम दिखाए गए हैं, तो आइटम 1, आइटम 2 और आइटम 3 कहें और यदि उपयोगकर्ता आइटम 2 पर क्लिक करता है, तो उसे आइटम 3 को विस्तार से देखा गया है (यानी सही नहीं कहने के लिए विवरण)
नीचे वह कोड है जो निष्पादित होता है जब सूची दृश्य में कोई आइटम क्लिक किया जाता है;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic -- create and push a new view controller
if(bookdetailCustom == nil)
bookdetailCustom = [[BookDetailCustom alloc] initWithNibName:@"BookDetailCustom" bundle:[NSBundle mainBundle]];
//aBook = [retrievedArray objectAtIndex:indexPath.row];
bookdetailCustom.selectedIndex = indexPath.row;
[self.navigationController pushViewController:bookdetailCustom animated:YES];
[bookdetailCustom release];
bookdetailCustom = nil;
}
यहाँ कैसे searchTabkleView
- (void) searchTableView {
NSString *searchText = searchBar.text;
NSMutableArray *searchArray = [[NSMutableArray alloc] init];
for (int i=0;i<[retrievedArray count];i++)
{
Stock *aBookTemp = [retrievedArray objectAtIndex:i];
NSString *temp = [aBookTemp valueForKey:@"BookName"];
[searchArray addObject:temp];
}
for (NSString *sTemp in searchArray)
{
NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (titleResultsRange.length > 0)
[copyListOfItems addObject:sTemp];
}
[searchArray release];
searchArray = nil;
}
कृपया सुझाव है कि कुछ उपयुक्त सुधारों की तरह लग रहा है।
अरे Anomie ... यहां इस मुद्दे को समझाने के लिए मेरे लिए बहुत मुश्किल था। लेकिन आपको लगता है कि समस्या पूरी तरह से समझ गई है ... अब समाधान पर आ रहा है, मैं आपके द्वारा सुझाए गए दूसरे दृष्टिकोण की ओर बढ़ना चाहता हूं। "एक और पार्सर को परिणामों को एक निजी सरणी में जमा करने के लिए होगा, और खुद को अपडेट करने के लिए सूची दृश्य को सिग्नल करने से ठीक पहले साझा किए गए सरणी को अपडेट करें" क्या आपके लिए एक छद्म कोड प्रदान करना संभव होगा आप कहने की कोशिश कर रहे हैं। मैं इसे अपने ऐप में लागू कर सकता हूं और देख सकता हूं कि यह काम करता है या नहीं। – testndtv
लेकिन हाँ, जैसा कि मैंने कहा था, चूंकि समस्या तब होती है जब उपयोगकर्ता बहुत तेज़ी से टाइप करता है, ऐसा लगता है कि 2 स्थानों में सरणी को अपडेट करने के लिए समय के साथ कुछ करना है। इस पर आपकी सभी मदद के लिए धन्यवाद। मैंने बिना किसी किस्मत के इस मुद्दे को ठीक करने के लिए अपना सर्वश्रेष्ठ दिया है और अब इस मुद्दे को ठीक करने के लिए वास्तव में हताश हूं। – testndtv
आपके NSXMLParserDelegate विधियों में आपको पुनर्प्राप्ति ऑर्रे में ऑब्जेक्ट्स जोड़ना होगा। इसके बजाय, पुनर्प्राप्त किए गए एररे फ़ील्ड के साथ एक 'अस्थायीअरे' फ़ील्ड जोड़ें, इसे '[पार्सर पार्स]' पर कॉल करने से पहले एक नए एनएसएमयूटेबलएरे में सेट करें, परिणामों को अस्थायी में जोड़ें, प्रतिनिधि विधियों में अरेय करें, और उसके बाद '[पार्सर पार्स]' रिटर्न कॉल '[पुनर्प्राप्त किया गया ऐरे बदलें ऑब्जेक्ट्स इनरेंज: एनएसएमकेरेंज (0, पुनर्प्राप्त आरायराउंट) ऑब्जेक्ट्स फ्रॉमएरे: अस्थायीअरे]। – Anomie