SlideShare a Scribd company logo
1 of 25
Download to read offline
NSOperation(Queue)
                      howto




    Krzysztof Profic | cocoaheads Kraków | 10.01.2013
Czy programowanie
wielowątkowe jest
      trudne?
Sposoby na wykonanie
        operacji w tle
•   pthread - POSIX thread

•   NSThread - Cocoa thread

•   Idle-time notifications (NSPostWhenIdle)

•   performSelectorInBackground:(SEL)sel

•   GCD & blocks: dispatch_async()

•   NSOperation
GCD vs NSOperation
•       GCD

    •    low-level C API

    •    podejście zadaniowe


•       NSOperation(Queue)

    •    podejście obiektowe
NSOperation

•       reprezentuje jednostkę obliczeniową

•       aby stworzyć subklasujemy lub:

•       korzystamy z istniejącej subklasy:

    •     NSInvocationOperaion

    •     NSBlockOperation
NSInvocationOperation
zbudowanie operacji:

- (id)initWithInvocation:(NSInvocation *)inv

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg



pobranie rezultatu

- (id)result
NSBlockOperation
zbudowanie operacji:

+ (id)blockOperationWithBlock:(void (^)(void))block



dodanie bloku

- (void)addExecutionBlock:(void (^)(void))block
subklasowanie NSOperation
   •   Subklasujemy (konwencja nazewnicza)
   •   Metody do nadpisania:
 - (void)main
 - (void)start
 - (BOOL)isConcurrent
 - (BOOL)isExecuting
 - (BOOL)isFinished
concurent
     vs
non-concurent
subklasowanie NSOperation
  •   Subklasujemy (konwencja nazwenicza)
  •   Implementujemy - (void)main
- (void)main

-(void)main
{
   @autoreleasepool {
       if ([self isCancelled]) return;

        NSURLRequest * req = [NSURLRequest requestWithURL:self.url];
        NSData * imageData = [NSURLConnection sendSynchronousRequest:req
                                                   returningResponse:nil error:nil];

        if (imageData == nil) return;
        if ([self isCancelled]) return;

        self.result = [UIImage imageWithData:imageData];
    }
}
Thread-safety
•   NSOperation jest thread-safe
•    trzeba zapewnić thread-safety dla swego
    kodu


@synchronized( ) {
  ...
}
Uruchomienie operacji
•    dodanie do kolejki (kolejka uruchamia
    operacje)
[queue addOperation:operation];


•   ręczne uruchomienie operacji (żadziej):
[operation start];
Completion


- (void)setCompletionBlock:(void (^)(void))block
Stan
•       maszyna stanowa

    •    isReady

    •    isFinished

    •    isExecuting

    •    isCanceled

•       obsługa KVO
Anulowanie
•   anulowanie operacji

    [operation cancel];


•   sprawdzanie stanu operacji:

    [self isCancelled]
Zależności


[filterOperation addDependency:downloadOperation];
[filterOperation removeDependency:downloadOperation];
Piorytety


[filterOperation setQueuePriority:NSOperationQueuePriorityHigh];
NSOperationQueue
•   obsługa zależności między operacjami

•   priorytety operacji

•   usypianie operacji

•   anulowanie wszystkich operacji

•   obsługa współbieżności
Twrzenie kolejki


NSOperationQueue * queue = [[NSOperationQueue alloc] init];
Obsługa współbieżności


queue.maxConcurrentOperationCount = 6;
Usypianie

•   uśpienie
[queue setSuspended:YES];


•   obudzenie
[queue setSuspended:NO];
Ciekawostki
•      designated initializer
@interface MyOperation : NSOperation

-(id)initWithNumber:(NSNumber *)start string:(NSString *)string;

@end

•      użycie delegate dla zwracanych wartości
[(NSObject *)self.delegate performSelectorOnMainThread:
(@selector(delegateMethod:)) withObject:object waitUntilDone:NO];

•      często sprawdzać isCancelled

•      anulowanie nie dzieje się natychmiast

•      zakończona operacja nie może być wykorzystana ponownie!

•      isFinished zawsze po zakończeniu == YES
Linki

•
    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference

•   http://nshipster.com/nsoperation/

•   http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

•   http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/
Dzięki :)

More Related Content

What's hot

Objective C
Objective CObjective C
Objective Ckonryd
 
RxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applicationsRxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applicationsallegro.tech
 
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...The Software House
 
Typescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JSTypescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JSPiotr Miazga
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...PROIDEA
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychFuture Processing
 
Pan Oponka - Biografia
Pan Oponka - BiografiaPan Oponka - Biografia
Pan Oponka - BiografiaFilip Tepper
 
Net core (dawniej 5.0) – co to dla mnie. też dużo o open source
Net core (dawniej   5.0) – co to dla mnie. też dużo o open sourceNet core (dawniej   5.0) – co to dla mnie. też dużo o open source
Net core (dawniej 5.0) – co to dla mnie. też dużo o open sourceTomasz Kopacz
 
Programowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsProgramowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsWojciech Grześkowiak
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. allegro.tech
 
Co nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoCo nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoBootstrap
 

What's hot (14)

Objective C
Objective CObjective C
Objective C
 
RxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applicationsRxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applications
 
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
 
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
 
Typescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JSTypescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JS
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Pan Oponka - Biografia
Pan Oponka - BiografiaPan Oponka - Biografia
Pan Oponka - Biografia
 
(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze
 
Net core (dawniej 5.0) – co to dla mnie. też dużo o open source
Net core (dawniej   5.0) – co to dla mnie. też dużo o open sourceNet core (dawniej   5.0) – co to dla mnie. też dużo o open source
Net core (dawniej 5.0) – co to dla mnie. też dużo o open source
 
Programowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsProgramowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel Extensions
 
Angular Restmod
Angular RestmodAngular Restmod
Angular Restmod
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
 
Co nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoCo nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'ego
 

NSOperation(Queue)