Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 77

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ здСсь Ρ†ΠΈΠΊΠ» 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-Ρ„Π°ΠΉΠ»Π΅):