Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

BOOL result = NO;

NSFileManager *fileManager = [[NSFileManager alloc] init];

if ([fileManager fileExistsAtPath: [self fileLocation]]){

result = YES;

}

return result;

}

А вот теперь очень важный нюанс. Мы хотим сохранить на диске массив из 10 000 случайных чисел, если, и только

если мы не создавали такой массив на диске раньше. В противном случае мы сразу загрузим массив с диска. Если же прежде мы не создавали этот массив на диске, то сначала создадим его, а потом перейдем к загрузке массива с диска. В итоге, если считывание массива с диска пройдет успешно, мы отсортируем этот массив в порядке возрастания и, наконец, отобразим результаты для пользователя в графическом интерфейсе. Реализацию отображения результатов пользователю оставляю вам для самостоятельной работы.

— (void) viewDidAppear:(BOOL)paramAnimated{

[super viewDidAppear: paramAnimated];

dispatch_queue_t concurrentQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

/* Если мы еще не отсортировали массив из 10 000 случайных чисел

на диске ранее, сгенерируем эти числа сейчас, а потом сохраним

их на диск в массиве. */

dispatch_async(concurrentQueue, ^{

NSUInteger numberOfValuesRequired = 10000;

if ([self hasFileAlreadyBeenCreated] == NO){

dispatch_sync(concurrentQueue, ^{

NSMutableArray *arrayOfRandomNumbers =

[[NSMutableArray alloc] initWithCapacity: numberOfValuesRequired];

NSUInteger counter = 0;

for (counter = 0;

counter < numberOfValuesRequired;

counter++){

unsigned int randomNumber =

arc4random % ((unsigned int)RAND_MAX + 1);

[arrayOfRandomNumbers addObject:

[NSNumber numberWithUnsignedInt: randomNumber]];

}

/* Теперь записываем массив на диск. */

[arrayOfRandomNumbers writeToFile: [self fileLocation]

atomically: YES];

});

}

__block NSMutableArray *randomNumbers = nil;

/* Считываем числа с диска и сортируем их в порядке возрастания. */

dispatch_sync(concurrentQueue, ^{

/* Если файл на данный момент уже создан, занимаемся его считыванием. */

if ([self hasFileAlreadyBeenCreated]){

randomNumbers = [[NSMutableArray alloc]

initWithContentsOfFile: [self fileLocation]];

/* Теперь
сортируем числа. */

[randomNumbers sortUsingComparator:

^NSComparisonResult(id obj1, id obj2) {

NSNumber *number1 = (NSNumber *)obj1;

NSNumber *number2 = (NSNumber *)obj2;

return [number1 compare: number2];

}];

}

});

dispatch_async(dispatch_get_main_queue, ^{

if ([randomNumbers count] > 0){

/* Обновляем пользовательский интерфейс, задействуя числа

из массива randomNumbers. */

}

});

});

}

Функционал GCD далеко не ограничивается синхронным или асинхронным выполнением блоков кода или функций. В разделе 7.9 вы научитесь группировать блоковые объекты и готовить их к выполнению в диспетчерской очереди. Кроме того, рекомендую вам изучить разделы 7.7. и 7.8, где говорится о прочих функциях, которые предоставляются программисту в GCD.

См. также

Разделы 7.4, 7.7 и 7.8.

7.7. Выполнение задач после задержки с помощью GCD

Постановка задачи

Требуется выполнить код, но после определенной задержки. Задержку планируется указывать с помощью GCD.

Решение

Воспользуйтесь функциями dispatch_after и dispatch_after_f.

Обсуждение

Работая с фреймворком Core Foundation, можно активизировать селектор в объекте по истечении заданного временного промежутка с помощью метода performSelector: withObject: afterDelay:, относящегося к классу NSObject. Например:

— (void) printString:(NSString *)paramString{

NSLog(@"%@", paramString);

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

[self performSelector:@selector(printString:)

withObject:@"Grand Central Dispatch"

afterDelay:3.0];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

// Точка переопределения для настройки после запуска приложения

self.window.backgroundColor = [UIColor whiteColor];

Поделиться:
Популярные книги

Сестры Бронте. Лучшие произведения в одном томе

Бронте Шарлотта
Проза:
классическая проза
5.00
рейтинг книги
Сестры Бронте. Лучшие произведения в одном томе

Зеркало ее сновидений

Дональдсон Стивен Ридер
1. Нужды Морданта
Фантастика:
фэнтези
7.17
рейтинг книги
Зеркало ее сновидений

Время гарпии

Пирс Энтони
17. Ксанф
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Время гарпии

Телемак

Фенелон Франсуа
Приключения:
исторические приключения
5.00
рейтинг книги
Телемак

Париж в 1814-1848 годах. Повседневная жизнь

Мильчина Вера Аркадьевна
Культура повседневности
Научно-образовательная:
история
культурология
5.00
рейтинг книги
Париж в 1814-1848 годах. Повседневная жизнь

Последний реанорец. Том IX

Павлов Вел
8. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
5.80
рейтинг книги
Последний реанорец. Том IX

Тристан и Женевьева (Среди роз)

Дрейк Шеннон
Любовные романы:
исторические любовные романы
7.67
рейтинг книги
Тристан и Женевьева (Среди роз)

Черный ветер

Касслер Клайв
18. Дирк Питт
Детективы:
боевики
6.25
рейтинг книги
Черный ветер

Заповедник гоблинов (сборник)

Саймак Клиффорд Дональд
Фантастика:
научная фантастика
5.00
рейтинг книги
Заповедник гоблинов (сборник)

О любви

Жуховицкий Леонид Аронович
Проза:
рассказ
5.00
рейтинг книги
О любви

Герой по принуждению. Трилогия

Абердин Александр М.
Фантастика:
фэнтези
боевая фантастика
попаданцы
3.81
рейтинг книги
Герой по принуждению. Трилогия

Куджо

Кинг Стивен
Фантастика:
ужасы и мистика
8.45
рейтинг книги
Куджо

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Тропа Войны и Магии

Радов Анатолий Анатольевич
4. Изгой
Фантастика:
фэнтези
9.10
рейтинг книги
Тропа Войны и Магии