NSOperation(Queue)

1,131 views
985 views

Published on

slides from the presentation that happend on 2nd cocoaheads in Cracow

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,131
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

NSOperation(Queue)

  1. 1. NSOperation(Queue) howto Krzysztof Profic | cocoaheads Kraków | 10.01.2013
  2. 2. Czy programowaniewielowątkowe jest trudne?
  3. 3. Sposoby na wykonanie operacji w tle• pthread - POSIX thread• NSThread - Cocoa thread• Idle-time notifications (NSPostWhenIdle)• performSelectorInBackground:(SEL)sel• GCD & blocks: dispatch_async()• NSOperation
  4. 4. GCD vs NSOperation• GCD • low-level C API • podejście zadaniowe• NSOperation(Queue) • podejście obiektowe
  5. 5. NSOperation• reprezentuje jednostkę obliczeniową• aby stworzyć subklasujemy lub:• korzystamy z istniejącej subklasy: • NSInvocationOperaion • NSBlockOperation
  6. 6. NSInvocationOperationzbudowanie operacji:- (id)initWithInvocation:(NSInvocation *)inv- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)argpobranie rezultatu- (id)result
  7. 7. NSBlockOperationzbudowanie operacji:+ (id)blockOperationWithBlock:(void (^)(void))blockdodanie bloku- (void)addExecutionBlock:(void (^)(void))block
  8. 8. subklasowanie NSOperation • Subklasujemy (konwencja nazewnicza) • Metody do nadpisania: - (void)main - (void)start - (BOOL)isConcurrent - (BOOL)isExecuting - (BOOL)isFinished
  9. 9. concurent vsnon-concurent
  10. 10. subklasowanie NSOperation • Subklasujemy (konwencja nazwenicza) • Implementujemy - (void)main
  11. 11. - (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]; }}
  12. 12. Thread-safety• NSOperation jest thread-safe• trzeba zapewnić thread-safety dla swego kodu@synchronized( ) { ...}
  13. 13. Uruchomienie operacji• dodanie do kolejki (kolejka uruchamia operacje)[queue addOperation:operation];• ręczne uruchomienie operacji (żadziej):[operation start];
  14. 14. Completion- (void)setCompletionBlock:(void (^)(void))block
  15. 15. Stan• maszyna stanowa • isReady • isFinished • isExecuting • isCanceled• obsługa KVO
  16. 16. Anulowanie• anulowanie operacji [operation cancel];• sprawdzanie stanu operacji: [self isCancelled]
  17. 17. Zależności[filterOperation addDependency:downloadOperation];[filterOperation removeDependency:downloadOperation];
  18. 18. Piorytety[filterOperation setQueuePriority:NSOperationQueuePriorityHigh];
  19. 19. NSOperationQueue• obsługa zależności między operacjami• priorytety operacji• usypianie operacji• anulowanie wszystkich operacji• obsługa współbieżności
  20. 20. Twrzenie kolejkiNSOperationQueue * queue = [[NSOperationQueue alloc] init];
  21. 21. Obsługa współbieżnościqueue.maxConcurrentOperationCount = 6;
  22. 22. Usypianie• uśpienie[queue setSuspended:YES];• obudzenie[queue setSuspended:NO];
  23. 23. 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
  24. 24. 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/
  25. 25. Dzięki :)

×