» » » » Вандад Нахавандипур - iOS. Приемы программирования

Вандад Нахавандипур - iOS. Приемы программирования

На нашем литературном портале можно бесплатно читать книгу Вандад Нахавандипур - iOS. Приемы программирования, Вандад Нахавандипур . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Вандад Нахавандипур - iOS. Приемы программирования
Название: iOS. Приемы программирования
ISBN: -
Год: -
Дата добавления: 3 июль 2019
Количество просмотров: 317
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

iOS. Приемы программирования читать книгу онлайн

iOS. Приемы программирования - читать бесплатно онлайн , автор Вандад Нахавандипур
Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.
1 ... 75 76 77 78 79 ... 165 ВПЕРЕД
Перейти на страницу:

/* Создаем здесь цикл while, существующий лишь в том случае,

когда переменная taskIsFinished устанавливается в YES

или операция отменяется. */

while (taskIsFinished == NO &&

[self isCancelled] == NO){


/* Здесь выполняется задача. */

NSLog(@"%s", __FUNCTION__);

NSLog(@"Parameter Object = %@", givenObject);

NSLog(@"Main Thread = %@", [NSThread mainThread]);

NSLog(@"Current Thread = %@", [NSThread currentThread]);


/* Очень важно. Здесь мы можем выйти из цикла, по-прежнему

соблюдая правила, по которым отменяются операции. */

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);

}

}


— (BOOL) isConcurrent{

return YES;

}


@end


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


@interface AppDelegate ()

@property (nonatomic, strong) NSOperationQueue *operationQueue;

@property (nonatomic, strong) SimpleOperation *firstOperation;

@property (nonatomic, strong) SimpleOperation *secondOperation;

@end


@implementation AppDelegate


Реализация делегата приложения такова:


— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSNumber *firstNumber = @111;

NSNumber *secondNumber = @222;


self.firstOperation = [[SimpleOperation alloc]

initWithObject: firstNumber];

self.secondOperation = [[SimpleOperation alloc]

initWithObject: secondNumber];


self.operationQueue = [[NSOperationQueue alloc] init];


/* Добавляем операции в очередь. */

[self.operationQueue addOperation: self.firstOperation];

[self.operationQueue addOperation: self.secondOperation];


NSLog(@"Main thread is here");


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


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


Main thread is here

-[SimpleOperation main]

-[SimpleOperation main]

Parameter Object = 222

Parameter Object = 222

Main Thread = <NSThread: 0x68 10260>{name = (null), num = 1}

Main Thread = <NSThread: 0x68 10260>{name = (null), num = 1}

Current Thread = <NSThread: 0x6a10b90>{name = (null), num = 3}

Current Thread = <NSThread: 0x6a13f50>{name = (null), num = 4}

См. также

Разделы 7.11 и 7.15.

7.13. Создание зависимости между операциями

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

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

Решение

Если операция B может начать выполнение содержащейся в ней задачи только после того, как операция A выполнит свою задачу, то операция B должна добавить к себе операцию A в качестве зависимой. Это делается с помощью метода экземпляра addDependency:, относящегося к классу NSOperation:


[self.firstOperation addDependency: self.secondOperation];


Свойства firstOperation и secondOperation относятся к типу NSInvocationOperation, подробнее об этом мы поговорим в подразделе «Обсуждение» данного раздела. В приведенном примере кода первая операция, находящаяся в операционной очереди, не будет выполняться до тех пор, пока не будет выполнена задача второй операции.

Обсуждение

Выполнение операции не начинается до тех пор, пока не будут успешно завершены все операции, от которых она зависит. По умолчанию после инициализации операция не связана зависимостями с какими-либо другими операциями.

Если мы хотим внедрить зависимости в пример с кодом, описанный в разделе 7.12, то можем немного изменить реализацию делегата приложения и воспользоваться методом экземпляра addDependency:, чтобы первая операция дождалась окончания выполнения второй операции:


#import «AppDelegate.h»


@interface AppDelegate ()

@property (nonatomic, strong) NSInvocationOperation *firstOperation;

@property (nonatomic, strong) NSInvocationOperation *secondOperation;

@property (nonatomic, strong) NSOperationQueue *operationQueue;

@end


@implementation AppDelegate

— (void) firstOperationEntry:(id)paramObject{


NSLog(@"First Operation — Parameter Object = %@",

paramObject);


NSLog(@"First Operation — Main Thread = %@",

[NSThread mainThread]);


NSLog(@"First Operation — Current Thread = %@",

[NSThread currentThread]);


}


— (void) secondOperationEntry:(id)paramObject{


NSLog(@"Second Operation — Parameter Object = %@",

paramObject);


NSLog(@"Second Operation — Main Thread = %@",

[NSThread mainThread]);


NSLog(@"Second Operation — Current Thread = %@",

[NSThread currentThread]);


}


— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSNumber *firstNumber = @111;

NSNumber *secondNumber = @222;


self.firstOperation = [[NSInvocationOperation alloc]

initWithTarget: self

selector:@selector(firstOperationEntry:)

object: firstNumber];


self.secondOperation = [[NSInvocationOperation alloc]

initWithTarget: self

selector:@selector(secondOperationEntry:)

object: secondNumber];


[self.firstOperation addDependency: self.secondOperation];


self.operationQueue = [[NSOperationQueue alloc] init];


/* Добавляем операции в очередь. */

[self.operationQueue addOperation: self.firstOperation];

[self.operationQueue addOperation: self.secondOperation];


NSLog(@"Main thread is here");


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Теперь после запуска программ вы увидите в окне консоли примерно следующее:

Second Operation — Parameter Object = 222

Main thread is here

Second Operation — Main Thread = <NSThread: 0x68 10250>{name = (null),

num = 1}

Second Operation — Current Thread = <NSThread: 0x6836ab0>{name = (null),

num = 3}

First Operation — Parameter Object = 111

First Operation — Main Thread = <NSThread: 0x68 10250>{name = (null),

num = 1}

First Operation — Current Thread = <NSThread: 0x6836ab0>{name = (null),

num = 3}


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

Если вы в любой момент пожелаете разорвать зависимость между двумя операциями, воспользуйтесь методом экземпляра removeDependency:, относящимся к объекту операции.

См. также

Раздел 7.12.

7.14. Создание таймеров

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

Требуется многократно выполнять определенную задачу после заданной задержки. Например, вы хотите обновлять вид на экране устройства каждую секунду, пока работает ваше приложение.

Решение

Воспользуйтесь таймером:


— (void) paint:(NSTimer *)paramTimer{

/* Делаем здесь что-либо. */

NSLog(@"Painting");

}


— (void) startPainting{


self.paintingTimer = [NSTimer

scheduledTimerWithTimeInterval:1.0

target: self

selector:@selector(paint:)

userInfo: nil

repeats: YES];


}


— (void) stopPainting{

if (self.paintingTimer!= nil){

[self.paintingTimer invalidate];

}

}


— (void)applicationWillResignActive:(UIApplication *)application{

[self stopPainting];

}


— (void)applicationDidBecomeActive:(UIApplication *)application{

[self startPainting];

}


Кроме того, метод invalidate будет высвобождать таймер сам и нам не придется делать это вручную. Как видите, мы определили свойство paintingTimer, которое следующим образом определяется в заголовочном файле (.h-файле):

1 ... 75 76 77 78 79 ... 165 ВПЕРЕД
Перейти на страницу:
Комментариев (0)