بحاجة إلى تخزين مجموعة صفيف من كائنات الفئة في عرض وحدة تحكم

StackOverflow https://stackoverflow.com/questions/1141119

سؤال

سؤال iPhone بالنسبة لك يا رفاق! لدي NSurLConnection يقوم بتنزيل XML من خادم ويعالجه في صفيف وهو جزء من صفيف آخر. ليس لدي طريقة لمعرفة عدد الكائنات التي ستحتاج إليها، لذلك لا يمكنني تخصيص NSArray مسبقا. سؤالي هو:

هل سيكون من الأفضل إنشاء الصفيف الأصل كمستوى NSArray على مستوى الفصل وتخصيصه بعد تخزين البيانات في nsmutablerray مؤقتا أو مجرد جعل nsmutablerray على مستوى الفصل؟ تجدر الإشارة إلى أنني لا أحتاج إلى تعديل مجموعة غيرها من إطلاقها في نهاية البرنامج.

هل كانت مفيدة؟

المحلول

لا أعتقد أنه يهم حقا.

أنا أقرأ بداية دفتر تطوير iPhone 3 في الوقت الحالي، وعادة ما يتم تحميل البيانات مثل هذا: سيكون لديك خاصية NSArray:

@interface
{
...
    NSArray *listOfObjects;
...
}
@property (nonatomic, retain) NSArray *listObObjects;
...

ثم تقوم بإنشاء nsmutablerray، قم بتحميل بياناتك وتعيين الخاصية:

NSMutableArray *array = [[NSMutableArray alloc] init]; // ?
// load the XML into array here
...
self.listOfObjects = array;
[array release];

سيتم بعد ذلك التعامل مع ListOboBjects ك NSArray (ثابت) على الرغم من أنها ستكون في الواقع nsmutablerray.

نصائح أخرى

أعتقد أن ما تريد القيام به هو إنشاء بعض الفصول التي تتطابق مع ما تمثله في XML الخاص بك. على سبيل المثال، إذا نظرت XML إلى شيء مثل هذا:

<peopleList>
  <person>
    <name>Joe</name>
    <possession>Shovel</possession>
  </person>
  <person>
    <name>Sam</name>
    <possession>Shovel</possession>
    <possession>Fork</possession>
    <possession>Backpack</possession>
  </person>
</peopleList>

يجب أن يكون لديك فئة Peoplelist وطبقة الشخص. يتم إنشاء مثيل من فئة PeopleList من صفيفك الأولى التي تحتوي على كائنات شخص أو أكثر. كائنات الشخص، بدوره، لها أيضا الحصول على صفائف لإجراء الامتثال (والتي في هذه الحالة سلاسل - على الرغم من ذلك إذا كانت اللازمة يمكن أن تكون كائنات المحتملين) في هذه الحالة، لمساعدة المثال على مثال فئة الشخص أيضا لديه خاصية أخرى: "الاسم" وهي أيضا سلسلة.

علي سبيل المثال:

@interface PeopleList {
    NSMutableArray *persons;  // An array to store the Person objects
}
@property (nonatomic, retain) NSMutableArray *persons;    
@end



@interface Person {
    NSString *name;  
    NSMutableArray *possesions; //An array to store this Person's possesion strings
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *possesions;
@end

في طريقة INITE هذه من هذه الكائنات، سيتعين عليك ALLOC / INIT الصفائف حتى تكون جاهزة لاستقبال الكائنات. ولأنني alloc'd لهم، ففي مسؤولة عن الإصدار.

@implementation PeopleList
    -(id) init {
        if (self = [super init]) {
             persons = [[NSMutableArray alloc] init];
        }
    }

    -(void) dealloc {
       [persons release];
       [super dealloc];
    }
@end


@implementation PeopleList
    -(id) init {
        if (self = [super init]) {
             possesions = [[NSMutableArray alloc] init];
        }
    }

    -(void) dealloc {
       [possesions release];
       [super dealloc];
    }
@end

الآن بعد أن يتم ذلك، يمكنك إعداد بنية بياناتك الخاصة بمجموعة متتالية. كما تقوم بتحليل XML عندما تأتي عبر علامة Peoplelist فعل A:

currentPeopleList = [[PeopleList alloc] init];

وعندما تأتي عبر شخص Tage القيام:

currentPerson = [[Person alloc] init];
[peopleList.persons addObject: person];

المحتمل:

[currentPerson.possesion addObject: contentsOfCurrentElement];

أو الاسم:

currentPerson.name = contentsOfCurrentElement;

ولكن للإجابة على سؤالك الأكثر تحديدا، لم أقم بتخزين البيانات في nsarray مؤقتة ثم انسخ ذلك إلى nsmutablerray. لا يوجد مكاسب لأداء تقريبا من خلال القيام بذلك، وستحرق دورات وحدة المعالجة المركزية والذاكرة تقوم بالنسخة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top