2010-08-18 13 views
5

के माध्यम से लूप कैसे करें मुझे कोर डेटा में मेरी सभी इकाइयों के माध्यम से लूप की आवश्यकता है और मैं NSFetchedresultcontroller का उपयोग कर रहा हूं।मेरे ऐप में nsfetchedresultcontroller

मैं इस समय इस तरह यह कर रहा हूँ:

NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects]; 

for (MyClass *item in tempArray) 
{ 
    // do something 
} 

[tempArray release]; tempArray = nil; 

वहाँ tempArray बनाए बिना यह करने के लिए किसी भी बेहतर तरीका है?

धन्यवाद एक बहुत

उत्तर

11

आप जो करना चाहते हैं उस पर निर्भर करता है। तुम सिर्फ तब एक मूल्य बदल रहे हैं यदि हां, तो वहाँ एक आसान तरीका है:

[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"] 

कौन सा वस्तुओं मान सेट के सभी के माध्यम से लूप होगा। यह एक मानक केवीसी ऑपरेशन है। ध्यान दें कि यह स्मृति का विस्तार करेगा क्योंकि उत्परिवर्तन के दौरान प्रत्येक इकाई को एहसास हो जाएगा।

यदि आपको प्रत्येक इकाई के साथ कहीं अधिक शामिल करने की आवश्यकता है या आप स्मृति समस्या में भाग रहे हैं तो चीजें थोड़ा और जटिल हो जाती हैं। नोट: कोडिंग के अनुकूलन चरण तक स्मृति के बारे में चिंता न करें। विशेष रूप से कोर डेटा के साथ स्मृति समस्याओं का पूर्व-अनुकूलन, आपके समय का अपशिष्ट है।

अवधारणा यह है कि आप प्रत्येक इकाई पर लूप करेंगे और इसे आवश्यकतानुसार बदल देंगे। इसके अलावा, एक निश्चित बिंदु पर आपको संदर्भ को सहेजना चाहिए, इसे रीसेट करना चाहिए और फिर स्थानीय ऑटोरेलीज पूल को निकालना चाहिए। यह आपकी स्मृति उपयोग कम हो जाएगा इससे पहले कि आप में अगले बैच खींच के रूप में आप वस्तुओं तुम सिर्फ स्मृति से बाहर वापस चालाकी से धक्का होगा उदाहरण के लिए:।

NSManagedObjectContext *moc = ...; 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSInteger drainCounter = 0; 
for (id object in [[self fetchedResultsController] fetchedObjects]) { 
    //Do your magic here 
    ++drainCounter; 
    if (drainCounter = 100) { 
    BOOL success = [moc save:&error]; 
    NSError *error = nil; 
    NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]); 
    [moc reset]; 
    [pool drain], pool = nil; 
    pool = [[NSAutoreleasePool alloc] init]; 
    drainCounter = 0; 
    } 
} 

BOOL success = [moc save:&error]; 
NSError *error = nil; 
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]); 
[pool drain], pool = nil; 

यह स्मृति उपयोग नीचे रखना होगा, लेकिन यह महंगा है! ! आप हर 100 वस्तुओं के बाद डिस्क मार रहे हैं। इसका उपयोग केवल की पुष्टि के बाद किया जाना चाहिए कि स्मृति एक समस्या है।

6

क्षमा करें, मुझे लगता है कि इस सवाल का जवाब स्पष्ट है:

 for (MyClass *item in self.fetchedResultsController.fetchedObjects) 
     { 
      //do something 
     } 

यह स्मृति के लिहाज से ऐसा करने के लिए एक अच्छा तरीका है?

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