Networking                   & Multitasking                    孔祥波12年12月23⽇日星期⽇日
network,tcp/ip,socket,CFNetWork                 http, restful api                 thread: posix thread,                 NS...
tcp/ip                 20世纪六十年代 美国国防部                 加州伯克利大学 BSD Unix                 OSI 七层/TCP/IP四层模型                 应...
Socket                 tcp/udp                 tcp 三次握手                 server/client 模型                 server: open/bind...
CFNetwork                 CFStream                 RUNLoop base                 CFReadStream create stream, set           ...
http                 http protocol                 Web service,SOAP,XML-RPC                 Get RSS and ATOM feeds        ...
web service restful                        api12年12月23⽇日星期⽇日
one more thing12年12月23⽇日星期⽇日
debug network                    package   tcpdump -A -s0 -i en1 host hostnameand                   port 80           Wire...
Multitasking12年12月23⽇日星期⽇日
Why Concurrency?                 With a single thread,long-running operations may                 interfere with user inte...
Threads on the iOS                 Based on the POSIX threading API                 /usr/include/pthread.h                ...
NSThread Basics                 Run loop automatically instantiated for each                 thread                 Each N...
Sample      - (void)someAction:(id)sender      {           // Fire up a new thread           [NSThread detachNewThreadSele...
UIKit and Threads                 Unless otherwise noted, UIKit classes are not                 threadsafe                ...
debug12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
build thread  - (void)threadDownload:(id)data  {      NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];      NSStr...
NSOperation12年12月23⽇日星期⽇日
basic                 Abstract superclass                 Manages thread creation and lifecycle                 Encapsulat...
NSOperationQueue                 Operations are typically scheduled by adding to a                 queue                 C...
KVC/KVO12年12月23⽇日星期⽇日
Key-Value Coding (KVC)    •Access object values       ■ NSString *name = person.name;       ■ NSString *name = [person nam...
Key-Value Coding (KVC)                 •Get/set a value on an object by key (a string)                 •First attempts to ...
Accessing Undefined Keys             •What if you try to access a key that is undefined?             ■NSUndefinedKeyException...
Key-Value Observing (KVO)                 •Listen for changes to an object’s KVC-compliant values                 •NSObjec...
Key-Value Observing (KVO)   •To listen for changes:   •To stop listening for changes:           -(void)addObserver:(NSObje...
Key-Value Observing (KVO)    •Observing a value change:    -(void)observeValueForKeyPath:(NSString *)keyPath    ofObject:(...
Demo12年12月23⽇日星期⽇日
NSInvocationOperation          Concrete subclass of NSOperation          For lightweight tasks where creating a subclass  ...
Apple Push Notification                 Service12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
工作流12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
Block and GCD12年12月23⽇日星期⽇日
Block定义                  int (^oneFrom)(int);         !         !       oneFrom = ^(int anInt) {         !       ! return ...
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
Writing to Local Variables12年12月23⽇日星期⽇日
Writing to Local Variables12年12月23⽇日星期⽇日
typedef void (^ScheduleFetcherResultBlock)(NSArray *classes, ! ! ! ! ! ! ! ! ! !         NSError *error);  - (void)fetchCl...
- (void)fetchClassesWithBlock:(ScheduleFetcherResultBlock)theBlock { ! // Copy the block to ensure that it is not kept on ...
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
UIViewAnimation style Animation       - (void)setSelectedVeg:(id)sender       {               [selectedVegetableIcon setAl...
- (void)setSelectedVeg:(id)sender  {          [selectedVegetableIcon setAlpha:0.0];            [UIView animateWithDuration...
NSNotification !    void (^block)(NSNotification *); !    block=^(NSNotification *noti){ !    ! NSLog(@"%@",[noti object])...
NSOperation           !     void (^oneFrom)(void);           !           !     oneFrom = ^(void) {           !     ! NSLog...
正则匹配    NSRegularExpression* regex2=nil;    regex2 =[[NSRegularExpression alloc] initWithPattern:@"(?<=>).*?(?=</a>)"    !...
GCD                 Grand Central DIspatch12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
12年12月23⽇日星期⽇日
-(IBAction)extractCurAll:(id)sender     {     ! [indicator setHidden:NO];     ! [indicator startAnimation:sender];     ! N...
use block and GCD    -(void)blockwork    {        dispatch_queue_t queue;    ! queue = dispatch_queue_create("com.example....
use GCD change our NSThread Code!12年12月23⽇日星期⽇日
Resource                 Session 102 - Whats New in Foundation for                 iOS 4                 Session 110 - Adv...
Queues                Objects                           Sources          dispatch_queue_t          dispatch_object_t      ...
Q&A12年12月23⽇日星期⽇日
Upcoming SlideShare
Loading in …5
×

Network and Multitasking

1,395 views

Published on

Networking, Multitasking
GCD and block

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

  • Be the first to like this

No Downloads
Views
Total views
1,395
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
81
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Network and Multitasking

  1. 1. Networking & Multitasking 孔祥波12年12月23⽇日星期⽇日
  2. 2. network,tcp/ip,socket,CFNetWork http, restful api thread: posix thread, NSThread,NSOperation,push notification Block and GCD12年12月23⽇日星期⽇日
  3. 3. tcp/ip 20世纪六十年代 美国国防部 加州伯克利大学 BSD Unix OSI 七层/TCP/IP四层模型 应用层http, pop3,smtp,ftp&12年12月23⽇日星期⽇日
  4. 4. Socket tcp/udp tcp 三次握手 server/client 模型 server: open/bind/listen/connected/ (send,recv)/close client: open/bind/connect/(send,recv)/ close12年12月23⽇日星期⽇日
  5. 5. CFNetwork CFStream RUNLoop base CFReadStream create stream, set call back and runloop, call back read bytes CFWriteStream12年12月23⽇日星期⽇日
  6. 6. http http protocol Web service,SOAP,XML-RPC Get RSS and ATOM feeds download file12年12月23⽇日星期⽇日
  7. 7. web service restful api12年12月23⽇日星期⽇日
  8. 8. one more thing12年12月23⽇日星期⽇日
  9. 9. debug network package tcpdump -A -s0 -i en1 host hostnameand port 80 Wireshark network protocol dump12年12月23⽇日星期⽇日
  10. 10. Multitasking12年12月23⽇日星期⽇日
  11. 11. Why Concurrency? With a single thread,long-running operations may interfere with user interaction Multiple threads allow you to load resources or perform computations without locking up your entire application12年12月23⽇日星期⽇日
  12. 12. Threads on the iOS Based on the POSIX threading API /usr/include/pthread.h Higher-level wrappers in the Foundation framework(NSSThread)12年12月23⽇日星期⽇日
  13. 13. NSThread Basics Run loop automatically instantiated for each thread Each NSThread needs to create its own autorelease pool Convenience methods for messaging between threads12年12月23⽇日星期⽇日
  14. 14. Sample - (void)someAction:(id)sender { // Fire up a new thread [NSThread detachNewThreadSelector:@selector(doWork:) withTarget:self object:someData]; } - (void)doWork:(id)someData { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [someData doLotsOfWork]; // Message back to the main thread [self performSelectorOnMainThread:@selector(allDone:) withObject:[someData result] waitUntilDone:NO]; //同步主线程 [pool release]; }12年12月23⽇日星期⽇日
  15. 15. UIKit and Threads Unless otherwise noted, UIKit classes are not threadsafe Objects must be created and messaged from the main thread12年12月23⽇日星期⽇日
  16. 16. debug12年12月23⽇日星期⽇日
  17. 17. 12年12月23⽇日星期⽇日
  18. 18. 12年12月23⽇日星期⽇日
  19. 19. build thread - (void)threadDownload:(id)data { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; NSString *urlStr=@"http://www.apple.com/home/images/t_hero.png"; NSData *imageData=[NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; UIImage *image=[UIImage imageWithData:imageData]; [self performSelectorOnMainThread:@selector(freshUIWith:) withObject:image waitUntilDone:YES]; [pool drain]; } - (void)freshUIWith:(UIImage*)image { self.imageView.image = image; }12年12月23⽇日星期⽇日
  20. 20. NSOperation12年12月23⽇日星期⽇日
  21. 21. basic Abstract superclass Manages thread creation and lifecycle Encapsulate a unit of work in an object •Specify priorities and dependencies12年12月23⽇日星期⽇日
  22. 22. NSOperationQueue Operations are typically scheduled by adding to a queue Choose a maximum number of concurrent operations Queue runs operations based on priority and dependencies12年12月23⽇日星期⽇日
  23. 23. KVC/KVO12年12月23⽇日星期⽇日
  24. 24. Key-Value Coding (KVC) •Access object values ■ NSString *name = person.name; ■ NSString *name = [person name]; ■ NSString *name = [person valueForKey:@“name”]; •Set object values: ■ [person setName:@“Pee-Wee Herman”]; ■ person.name = @“Pee-Wee Herman”; ■[person setValue:@“Pee-Wee Herman” forKey:@“name”];12年12月23⽇日星期⽇日
  25. 25. Key-Value Coding (KVC) •Get/set a value on an object by key (a string) •First attempts to access via KVC-Compliant getters/setters •If that fails, attempts to get to value directly Key Paths •Traverse objects using dot-separated keys •Ex: @”person.address.street” •Must use “keyPath” methods, instead of “key” methods to automatically parse the string - (id)valueForKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;12年12月23⽇日星期⽇日
  26. 26. Accessing Undefined Keys •What if you try to access a key that is undefined? ■NSUndefinedKeyException •But you can override! -(id)valueForUndefinedKey:(NSString *)key; -(void)setValue:(id)value forUndefinedKey: (NSString *)key;12年12月23⽇日星期⽇日
  27. 27. Key-Value Observing (KVO) •Listen for changes to an object’s KVC-compliant values •NSObject automatically broadcasts changes to observers •No changes required to object being listened to12年12月23⽇日星期⽇日
  28. 28. Key-Value Observing (KVO) •To listen for changes: •To stop listening for changes: -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; -(void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath;12年12月23⽇日星期⽇日
  29. 29. Key-Value Observing (KVO) •Observing a value change: -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == myContext) { // Do something } else { // Don’t forget to call super } }12年12月23⽇日星期⽇日
  30. 30. Demo12年12月23⽇日星期⽇日
  31. 31. NSInvocationOperation Concrete subclass of NSOperation For lightweight tasks where creating a subclass is overkill - (void)someAction:(id)sender { NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doWork:) object:someObject]; [queue addObject:operation]; [operation release]; }12年12月23⽇日星期⽇日
  32. 32. Apple Push Notification Service12年12月23⽇日星期⽇日
  33. 33. 12年12月23⽇日星期⽇日
  34. 34. 12年12月23⽇日星期⽇日
  35. 35. 12年12月23⽇日星期⽇日
  36. 36. 工作流12年12月23⽇日星期⽇日
  37. 37. 12年12月23⽇日星期⽇日
  38. 38. Block and GCD12年12月23⽇日星期⽇日
  39. 39. Block定义 int (^oneFrom)(int); ! ! oneFrom = ^(int anInt) { ! ! return anInt - 1; ! }; ! ! NSLog(@"%d",oneFrom(10));12年12月23⽇日星期⽇日
  40. 40. 12年12月23⽇日星期⽇日
  41. 41. 12年12月23⽇日星期⽇日
  42. 42. Writing to Local Variables12年12月23⽇日星期⽇日
  43. 43. Writing to Local Variables12年12月23⽇日星期⽇日
  44. 44. typedef void (^ScheduleFetcherResultBlock)(NSArray *classes, ! ! ! ! ! ! ! ! ! ! NSError *error); - (void)fetchClassesWithBlock: (ScheduleFetcherResultBlock)theBlock;12年12月23⽇日星期⽇日
  45. 45. - (void)fetchClassesWithBlock:(ScheduleFetcherResultBlock)theBlock { ! // Copy the block to ensure that it is not kept on the stack: ! resultBlock = [theBlock copy]; ! ! NSURL *xmlURL = [NSURL URLWithString: ! ! ! ! ! @"http://bignerdranch.com/xml/schedule"]; ! NSURLRequest *req = [NSURLRequest requestWithURL:xmlURL ! ! ! ! ! ! ! ! ! ! cachePolicy:NSURLRequestReturnCacheDataElseLoad ! ! ! ! ! ! ! ! ! timeoutInterval:30]; ! connection = [[NSURLConnection alloc] initWithRequest:req ! ! ! ! ! ! ! ! ! ! ! ! delegate:self]; ! if (connection) ! { ! ! responseData = [[NSMutableData alloc] init]; ! } resultBlock(nil, error); }12年12月23⽇日星期⽇日
  46. 46. 12年12月23⽇日星期⽇日
  47. 47. 12年12月23⽇日星期⽇日
  48. 48. 12年12月23⽇日星期⽇日
  49. 49. UIViewAnimation style Animation - (void)setSelectedVeg:(id)sender {         [selectedVegetableIcon setAlpha:0.0]; ! [UIView beginAnimations:@"setSelectedVeg" context:nil]; ! float angle = [self spinnerAngleForVegetable:sender]; ! [vegetableSpinner setTransform:CGAffineTransformMakeRotation(angle)]; ! [UIView setAnimationDuration:0.4]; ! [UIView setAnimationDelegate:self]; ! [UIView setAnimationDidStopSelector:@selector(done)]; ! [UIView commitAnimations]; ! } -(void)done { ! [selectedVegetableIcon setAlpha:1.0]; }12年12月23⽇日星期⽇日
  50. 50. - (void)setSelectedVeg:(id)sender {         [selectedVegetableIcon setAlpha:0.0];          [UIView animateWithDuration:0.4             animations: ^{              float angle = [self spinnerAngleForVegetable:sender];              [vegetableSpinner setTransform:CGAffineTransformMakeRotation(angle)];             }              completion:^(BOOL finished) {                [selectedVegetableIcon setAlpha:1.0];     }]; } 以上代码来⾃自WWDC2010 iPlant PlantCareViem.m12年12月23⽇日星期⽇日
  51. 51. NSNotification ! void (^block)(NSNotification *); ! block=^(NSNotification *noti){ ! ! NSLog(@"%@",[noti object]); ! }; ! queue =[[NSOperationQueue alloc] init]; ! [[NSNotificationCenter defaultCenter] addObserverForName:@"Blocktest" ! ! ! ! ! ! ! ! ! ! ! ! ! object:self ! ! ! ! ! ! ! ! ! ! ! ! ! queue:queue ! ! ! ! ! ! ! ! ! ! ! ! usingBlock:block]; [[NSNotificationCenter defaultCenter] postNotificationName:@"Blocktest" object:self];12年12月23⽇日星期⽇日
  52. 52. NSOperation ! void (^oneFrom)(void); ! ! oneFrom = ^(void) { ! ! NSLog(@"from opt"); ! }; ! NSOperation *opt=[[NSOperation alloc] init]; ! [opt setCompletionBlock:oneFrom]; ! [queue addOperation:opt];12年12月23⽇日星期⽇日
  53. 53. 正则匹配 NSRegularExpression* regex2=nil; regex2 =[[NSRegularExpression alloc] initWithPattern:@"(?<=>).*?(?=</a>)" ! ! ! ! ! ! ! ! ! ! options:NSRegularExpressionCaseInsensitive error:nil]; [regex enumerateMatchesInString:src options:0 range:NSMakeRange(0, [src length]) ! ! usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { ! ! NSString*resultString = [src substringWithRange:[result range]]; NSRange range0= NSMakeRange(0,[resultString length]); NSRange range1= [[regex2 firstMatchInString:resultString options:0 range:range0] range]; ! ! NSString*link=[resultString substringWithRange:range1]; ! ! ! ! ! ! ! ! }];12年12月23⽇日星期⽇日
  54. 54. GCD Grand Central DIspatch12年12月23⽇日星期⽇日
  55. 55. 12年12月23⽇日星期⽇日
  56. 56. 12年12月23⽇日星期⽇日
  57. 57. 12年12月23⽇日星期⽇日
  58. 58. 12年12月23⽇日星期⽇日
  59. 59. 12年12月23⽇日星期⽇日
  60. 60. 12年12月23⽇日星期⽇日
  61. 61. 12年12月23⽇日星期⽇日
  62. 62. 12年12月23⽇日星期⽇日
  63. 63. 12年12月23⽇日星期⽇日
  64. 64. 12年12月23⽇日星期⽇日
  65. 65. -(IBAction)extractCurAll:(id)sender { ! [indicator setHidden:NO]; ! [indicator startAnimation:sender]; ! NSLog(@"extractCurAll"); ! ! ! dispatch_queue_t queue; ! queue = dispatch_queue_create("com.example.operation", NULL); ! dispatch_async(queue, ^{ ! ! // Create a CGPDFDocumentRef from the input PDF file. ! ! CGPDFDocumentRef pdfDoc = NULL; ! ! pdfDoc = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); ! ! [[PDFImageExtrator sharedPDFImageExtrator] setUrl:pdfURL]; ! ! [[PDFImageExtrator sharedPDFImageExtrator] ExtratorWithPDF:pdfDoc]; ! ! dispatch_async(dispatch_get_main_queue(),^{ ! ! ! [indicator stopAnimation:sender]; ! ! ! [indicator setHidden:YES]; ! ! ! [openBtn setEnabled:YES]; ! ! }); ! }); ! dispatch_release(queue);! }12年12月23⽇日星期⽇日
  66. 66. use block and GCD -(void)blockwork { dispatch_queue_t queue; ! queue = dispatch_queue_create("com.example.operation", NULL); ! dispatch_async(queue, ^{ ! ! // Create a CGPDFDocumentRef from the input PDF file. NSString *urlStr=@"http://www.apple.com/home/images/ t_hero.png"; NSData *imageData=[NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; UIImage *image=[UIImage imageWithData:imageData]; ! ! dispatch_async(dispatch_get_main_queue(),^{ ! ! ! self.imageView.image = image; ! ! }); ! }); ! dispatch_release(queue);! }12年12月23⽇日星期⽇日
  67. 67. use GCD change our NSThread Code!12年12月23⽇日星期⽇日
  68. 68. Resource Session 102 - Whats New in Foundation for iOS 4 Session 110 - Advanced Text Handling for iPhone OS Session 206 - Introducing Blocks and Grand Central Dispatch on iPhone Session 211 - Simplifying iPhone App Development with Grand Central Dispatch12年12月23⽇日星期⽇日
  69. 69. Queues Objects Sources dispatch_queue_t dispatch_object_t dispatch_source_t dispatch_queue_create dispatch_retain dispatch_source_create dispatch_queue_get_label dispatch_release dispatch_source_cancel dispatch_get_main_queue dispatch_suspend dispatch_source_testcancel dispatch_get_global_queue dispatch_resume dispatch_source_merge_data dispatch_get_current_queue dispatch_debug dispatch_source_get_handle dispatch_main dispatch_get_context dispatch_source_get_mask dispatch_async dispatch_set_context dispatch_source_get_data dispatch_async_f dispatch_set_finalizer_f dispatch_source_set_timer dispatch_sync dispatch_set_target_queue dispatch_source_set_event_handler dispatch_sync_f dispatch_source_set_event_handler_f dispatch_after dispatch_source_set_cancel_handler dispatch_after_f dispatch_source_set_cancel_handler_f dispatch_apply dispatch_apply_f Groups dispatch_group_t dispatch_group_create Not Objects dispatch_group_enter Semaphores dispatch_group_leave dispatch_semaphore_t dispatch_group_wait Time Once dispatch_group_notify dispatch_time_t dispatch_once_t dispatch_semaphore_create dispatch_group_notify_f dispatch_semaphore_signal dispatch_group_async dispatch_time dispatch_once dispatch_semaphore_wait dispatch_group_async_f dispatch_walltime dispatch_once_f12年12月23⽇日星期⽇日
  70. 70. Q&A12年12月23⽇日星期⽇日

×