NSMutableArray of Objects - PullRequest
       10

NSMutableArray of Objects

1 голос
/ 11 апреля 2010

Прежде всего, я очень новичок в программировании на Objective C и iPhone. Теперь, когда это не так. Я прочитал большую часть документации Apple по этому и некоторым сторонним руководствам.

Полагаю, я просто хочу знать, правильно ли я поступлю ...

- (NSMutableArray *)makeModel {

    NSString *api = @"http://www.mycoolnewssite.com/api/v1";

    NSArray *namesArray = [NSArray arrayWithObjects:@"News", @"Sports", @"Entertainment", @"Business", @"Features", nil];

    NSArray *urlsArray = [NSArray arrayWithObjects:
                      [NSString stringWithFormat:@"%@/news/news/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/sports/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/entertainment/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/business/25/stories.json", api],
                      [NSString stringWithFormat:@"%@/news/features/25/stories.json", api], nil];

    NSMutableArray *result = [NSMutableArray array];

    for (int i = 0; i < [namesArray count]; i++) {
        NSMutableDictionary *objectDict = [NSMutableDictionary dictionary];
        NSString *name = (NSString *)[namesArray objectAtIndex:i];
        NSString *url = (NSString *)[urlsArray objectAtIndex:i];
        [objectDict setObject:name forKey:@"NAME"];
        [objectDict setObject:url forKey:@"URL"];
        [objectDict setObject:@"NO" forKey:@"HASSTORIES"];
        [result addObject:objectDict];
    }

    return result;
}

Вывод результата ...

(
    {
    HASSTORIES = NO;
    NAME = News;
    URL = "http://www.mycoolnewssite.com/api/v1/news/news/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Sports;
    URL = "http://www.mycoolnewssite.com/api/v1/news/sports/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Entertainment;
    URL = "http://www.mycoolnewssite.com/api/v1/news/entertainment/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Business;
    URL = "http://www.mycoolnewssite.com/api/v1/news/business/25/stories.json";
},
    {
    HASSTORIES = NO;
    NAME = Features;
    URL = "http://www.mycoolnewssite.com/api/v1/news/features/25/stories.json";
}
)

Любое понимание будет оценено; -)

1 Ответ

4 голосов
/ 11 апреля 2010

выглядит хорошо. Если вы заботитесь, могут быть небольшие улучшения.

1.

[NSString stringWithFormat:@"%@/news/news/25/stories.json", api]

можно заменить на

[api stringByAppendingString:@"/news/news/25/stories.json"]

если нет никаких шансов, то api появится посередине или примет другие аргументы.

2.

    NSString *name = (NSString *)[namesArray objectAtIndex:i];
    NSString *url = (NSString *)[urlsArray objectAtIndex:i];

Явное приведение не требуется. id может быть неявно приведен к и от других объектов ObjC.

3.

Вы можете использовать удобный метод -dictionaryWithObjectsAndKeys:, чтобы создать словарь за один раз, поэтому вам не нужен словарь температуры:

[result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:
   name, @"NAME",
   url, @"URL",
   @"NO", @"HASSTORIES", nil]];

4. (Опционально)

Это преобразование бесполезно, если функция не является горячей точкой.

Поскольку массивы используются только локально, более эффективно использовать массив C.

static const int arraySize = 5;
NSString* namesCArray[] = {@"News", @"Sports", @"Entertainment", @"Business", @"Features"};
NSString* urlsCArray[arraySize];
urlsArray[0] = [api stringByAppendingString:@"/news/news/25/stories.json"];
...
for (int i = 0; i < arraySize; ++ i) {
  ...
  NSString* name = namesCArray[i];
  NSString* url = urlsCArray[i];
  ...
}

удаляет повторные вызовы -count и -objectAtIndex:, что очень медленно по сравнению с прямым доступом к элементу.

5. (Опционально)

Это преобразование бесполезно, если массив короткий.

Вы можете использовать быстрое перечисление для циклического перемещения по контейнеру ObjC:

int i = 0;
for (NSString* name in namesArray) {
  NSString* url = [urlsArray objectAtIndex:i];
  ...
  ++ i;
}

6.

Обычно мы используем [NSNumber numberWithBool:NO] для представления значения true / false в штучной упаковке вместо строки @"NO". NSNumber также часто используется всякий раз, когда нельзя использовать простое число (int, float и т. Д.) (Например, для хранения в NSArray). Я не знаю, требуется ли для вашего API явно строка НЕТ, поэтому она может не подойти вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...