iOS. Приемы программирования
Шрифт:
#import «CountingOperation.h»
@implementation CountingOperation
@property (nonatomic, unsafe_unretained) NSUInteger startingCount;
@property (nonatomic, unsafe_unretained) NSUInteger endingCount;
@property (nonatomic, unsafe_unretained, getter=isFinished) BOOL finished;
@property (nonatomic, unsafe_unretained, getter=isExecuting) BOOL executing;
@end
@implementation CountingOperation
— (instancetype) init {
return([self initWithStartingCount:0
endingCount:1000]);
}
— (instancetype) initWithStartingCount:(NSUInteger)paramStartingCount
endingCount:(NSUInteger)paramEndingCount{
self = [super init];
if (self!= nil){
/* Сохраните
эти значения для главного метода. */
startingCount = paramStartingCount;
endingCount = paramEndingCount;
}
return(self);
}
— (void) main {
@try {
/* Это автоматически высвобождаемый пул. */
@autoreleasepool {
/* Сохраняем здесь локальную переменную, которая
должна быть установлена в YES всякий раз, когда
мы завершаем выполнение задачи. */
BOOL taskIsFinished = NO;
/* Создаем здесь цикл while, существующий лишь в том случае,
когда переменная taskIsFinished устанавливается в YES
или операция отменяется. */
while (taskIsFinished == NO &&
[self isCancelled] == NO){
/* Здесь выполняется задача. */
NSLog(@"Main Thread = %@", [NSThread mainThread]);
NSLog(@"Current Thread = %@", [NSThread currentThread]);
NSUInteger counter = startingCount;
for (counter = startingCount;
counter < endingCount;
counter++){
NSLog(@"Count = %lu", (unsigned long)counter);
}
/* Очень важно. Здесь мы можем выйти из цикла, по-прежнему
соблюдая правила, по которым отменяются операции. */
taskIsFinished = YES;
}
/* Соответствие KVO. Генерируем
требуемые уведомления KVO. */
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
finished = YES;
executing = NO;
[self didChangeValueForKey:@"isFinished"];
[self didChangeValueForKey:@"isExecuting"];
}
}
@catch (NSException * e) {
NSLog(@"Exception %@", e);
}
}
@end
Операцию можно начать так:
@interface AppDelegate
@property (nonatomic, strong) CountingOperation *simpleOperation;
@end
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.simpleOperation = [[CountingOperation alloc] initWithStartingCount:0
endingCount:1000];
[self.simpleOperation start];
NSLog(@"Main thread is here");
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
@end
Запустив данный код, мы увидим в окне консоли следующие результаты, точно как при применении блоковой операции:
Main Thread = <NSThread: 0x68 10260>{name = (null), num = 1}
Current Thread = <NSThread: 0x68 10260>{name = (null), num = 1}
…
Count = 993
Count = 994
Count = 995
Count = 996
Count = 997
Count = 998
Count = 999
Main thread is here
См. также
Раздел 7.12.
Поделиться:
Популярные книги
Остров любви
Проза:
современная проза
7.00
рейтинг книги
Точка Бифуркации V
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Уникумы Вселенной
1. Уникумы Вселенной
Фантастика:
боевая фантастика
космическая фантастика
7.29
рейтинг книги
Дважды одаренный. Том V
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.50
рейтинг книги
Кубинский зал
Детективы:
прочие детективы
6.40
рейтинг книги
"Охотник". Компиляция. Книги 1-12
Собрание сочинений
Фантастика:
боевая фантастика
5.00
рейтинг книги
День вампира (сборник)
Фантастика:
социально-философская фантастика
боевая фантастика
ужасы и мистика
6.80
рейтинг книги
Пересекающиеся параллели
Детективы:
прочие детективы
9.38
рейтинг книги
Николай I
17. Романовы. Династия в романах
Проза:
историческая проза
5.00
рейтинг книги
Батальоны тьмы. Трилогия
18. Фантастический боевик
Фантастика:
боевая фантастика
5.00
рейтинг книги
История Призрака
13. Досье Дрездена
Фантастика:
ужасы и мистика
детективная фантастика
8.67
рейтинг книги
Кукушка
4. Жуга
Фантастика:
фэнтези
8.40
рейтинг книги
День греха
Любовные романы:
остросюжетные любовные романы
9.03
рейтинг книги
Имперец. Том 1 и Том 2
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00