Download - Fit c Mobile 2010
![Page 1: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/1.jpg)
Jim DoveyiTeam Lead DeveloperKobo Inc.http://alanquatermain.net
Optimized Networking and Data Handling in iOS 4
Friday, September 17, 2010
Been writing software professionally for 11 years, almost every project has involved networking as a major component
![Page 2: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/2.jpg)
In this session…
•Networking• Asynchronicity• Resource usage• Network availability
•Data• Problems with large data sets• Asynchronicity
Friday, September 17, 2010
Today we’ll look at how to make the most of iOS networking frameworksAsynchronous APIs and techniques, limited resource usage, and do’s & don’ts of Reachability APIsAlso data— handling large amounts of data from the network with few resources. Asynchronously.
![Page 3: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/3.jpg)
In this session…
•Networking• Asynchronicity• Resource usage• Network availability
•Data• Problems with large data sets• Asynchronicity
Friday, September 17, 2010
Today we’ll look at how to make the most of iOS networking frameworksAsynchronous APIs and techniques, limited resource usage, and do’s & don’ts of Reachability APIsAlso data— handling large amounts of data from the network with few resources. Asynchronously.
![Page 4: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/4.jpg)
In this session…
•Networking• Asynchronicity• Resource usage• Network availability
•Data• Problems with large data sets• Asynchronicity
Friday, September 17, 2010
Today we’ll look at how to make the most of iOS networking frameworksAsynchronous APIs and techniques, limited resource usage, and do’s & don’ts of Reachability APIsAlso data— handling large amounts of data from the network with few resources. Asynchronously.
![Page 5: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/5.jpg)
In this session…
•Networking• Asynchronicity• Resource usage• Network availability
•Data• Problems with large data sets• Asynchronicity
Friday, September 17, 2010
Today we’ll look at how to make the most of iOS networking frameworksAsynchronous APIs and techniques, limited resource usage, and do’s & don’ts of Reachability APIsAlso data— handling large amounts of data from the network with few resources. Asynchronously.
![Page 6: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/6.jpg)
Asynchronicity
Friday, September 17, 2010
The Most Important Word In The World
![Page 7: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/7.jpg)
Why asynchronous?
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 8: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/8.jpg)
Why asynchronous?
• “I only use the network occasionally.”
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 9: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/9.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 10: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/10.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 11: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/11.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”⌧ Latency doesn’t care about packet size
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 12: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/12.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”⌧ Latency doesn’t care about packet size
• “I only send, I don’t wait for a reply.”
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 13: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/13.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”⌧ Latency doesn’t care about packet size
• “I only send, I don’t wait for a reply.”⌧ You might not, but TCP will
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 14: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/14.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”⌧ Latency doesn’t care about packet size
• “I only send, I don’t wait for a reply.”⌧ You might not, but TCP will
• “It’s always prompted by the user— they expect to wait.”
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 15: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/15.jpg)
Why asynchronous?
• “I only use the network occasionally.”⌧ Occasional = Unexpected
• “I only send very small packets.”⌧ Latency doesn’t care about packet size
• “I only send, I don’t wait for a reply.”⌧ You might not, but TCP will
• “It’s always prompted by the user— they expect to wait.”⌧ What if they change their mind?
Friday, September 17, 2010
There are a few reasons people come up with to explain why they don’t need to plan for async behaviour.
![Page 16: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/16.jpg)
Synchronous + Main Thread = Death
Friday, September 17, 2010
NEVER DO THIS
![Page 17: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/17.jpg)
Watchdog vs. the Net
Operation Default Timeout
Watchdog 20 seconds
DNS Lookup 30 seconds
TCP Connection 75 seconds
NSURLConnection 60 seconds
Friday, September 17, 2010
Watchdog will kill your app long before any of your standard networking tasks times out
![Page 18: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/18.jpg)
Watchdog vs. the Net
Operation Default Timeout
Watchdog 20 seconds
DNS Lookup 30 seconds
TCP Connection 75 seconds
NSURLConnection 60 seconds
Friday, September 17, 2010
Watchdog will kill your app long before any of your standard networking tasks times out
![Page 19: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/19.jpg)
Watchdog vs. the Net
Operation Default Timeout
Watchdog 20 seconds
DNS Lookup 30 seconds
TCP Connection 75 seconds
NSURLConnection 60 seconds
Friday, September 17, 2010
Watchdog will kill your app long before any of your standard networking tasks times out
![Page 20: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/20.jpg)
Watchdog vs. the Net
Operation Default Timeout
Watchdog 20 seconds
DNS Lookup 30 seconds
TCP Connection 75 seconds
NSURLConnection 60 seconds
Friday, September 17, 2010
Watchdog will kill your app long before any of your standard networking tasks times out
![Page 21: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/21.jpg)
Why asynchronous?
Friday, September 17, 2010
![Page 22: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/22.jpg)
Why asynchronous?
• Responsiveness• User Interface can update (e.g. to show progress)
• Other app jobs aren’t held up
Friday, September 17, 2010
![Page 23: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/23.jpg)
Why asynchronous?
• Responsiveness• User Interface can update (e.g. to show progress)
• Other app jobs aren’t held up
• Cancellation• App quits, user cancels, or an error occurs
Friday, September 17, 2010
![Page 24: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/24.jpg)
Why asynchronous?
• Responsiveness• User Interface can update (e.g. to show progress)
• Other app jobs aren’t held up
• Cancellation• App quits, user cancels, or an error occurs
• Prioritization• Not all messages are of equal importance
Friday, September 17, 2010
![Page 25: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/25.jpg)
- (void) doNetworkStuff { [self fetchHeader]; [self inspectHeader]; [self fetchAttrs]; [self inspectAttrs]; [self fetchData]; [self storeData];}
- (void) start { [self requestHeader];}- (void) gotHeader { [self inspectHeader]; [self requestAttrs];}
- (void) gotAttrs { [self inspectAttrs]; [self requestData];}
- (void) gotData { [self storeData];}
Friday, September 17, 2010
Grabbing file data from a server: basic info (header), attributes (ACLs, resource data), content
![Page 26: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/26.jpg)
- (void) doNetworkStuff { [self fetchHeader]; [self inspectHeader]; [self fetchAttrs]; [self inspectAttrs]; [self fetchData]; [self storeData];}
- (void) start { [self requestHeader];}- (void) gotHeader { [self inspectHeader]; [self requestAttrs];}
- (void) gotAttrs { [self inspectAttrs]; [self requestData];}
- (void) gotData { [self storeData];}
Friday, September 17, 2010
Split it up. Send a request, let the system tell you when the response is ready to be handled
![Page 27: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/27.jpg)
Not just ‘network in the background’
• Connecting• Retrieving data• Parsing data• Display updates
Friday, September 17, 2010
Lots of different things involved around the use of networked data
![Page 28: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/28.jpg)
New Thread + Synchronous Calls
• Pros• Easily re-use existing synchronous code
• Fast and simple to implement
• Cons• Cancellation is difficult
• Many connections means many threads
• Not the best use of processing time per thread
Friday, September 17, 2010
Wrapping sync code in new threadsThreads take up precious resources, are not cheap enough to spawn & throw away over and over
![Page 29: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/29.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
Friday, September 17, 2010
![Page 30: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/30.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
- (void) networkCall { [self performSelectorInBackground: @selector(runNetworkCall)];}
Friday, September 17, 2010
![Page 31: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/31.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
- (void) networkCall { [self performSelectorInBackground: @selector(runNetworkCall)];}
- (void) runNetworkCall { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; MySyncNetworkCall(); [pool drain];}
Friday, September 17, 2010
This approach necessitates the creation of a thread-main function of some kind
![Page 32: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/32.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
- (void) networkCall { dispatch_async(q, ^{ MySyncNetworkCall(); }}
Friday, September 17, 2010
This approach does not— but more of that later
![Page 33: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/33.jpg)
NSURLConnection and NSRunLoop
• Default API model is asynchronous using run loops
• Uses delegation to decouple networking details from program logic
• Delegation API allows for many things:
• Authentication
• Redirection
• Common network protocols completely abstracted (HTTP, FTP, and TLS/SSL)
• One-click support for HTTP pipelining
Friday, September 17, 2010
Asynchronous by default, encapsulates the major protocolsHTTP pipelining
![Page 34: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/34.jpg)
NSURLConnection
- (void) startRequestForURL: (NSURL *) url {NSURLRequest *r = [NSURLRequest requestWithURL: url];myConn = [[NSURLConnection connectionWithRequest: r delegate: self] retain];
}
Friday, September 17, 2010
NSURL is used to designate the remote resource
![Page 35: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/35.jpg)
NSURLConnection
- (void) startRequestForURL: (NSURL *) url {NSURLRequest *r = [NSURLRequest requestWithURL: url];myConn = [[NSURLConnection connectionWithRequest: r delegate: self] retain];
}
Friday, September 17, 2010
Create a request— can be as simple as this, or optionally more involved for particular protocols i.e. HTTP
![Page 36: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/36.jpg)
NSURLConnection
- (void) startRequestForURL: (NSURL *) url {NSURLRequest *r = [NSURLRequest requestWithURL: url];myConn = [[NSURLConnection connectionWithRequest: r delegate: self] retain];
}
Friday, September 17, 2010
Create the URL connection, which starts the data transfer going
![Page 37: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/37.jpg)
NSURLConnection
- (void) startRequestForURL: (NSURL *) url {NSURLRequest *r = [NSURLRequest requestWithURL: url];myConn = [[NSURLConnection connectionWithRequest: r delegate: self] retain];
}
Friday, September 17, 2010
Keep the connection around, or it will close when it’s autoreleased or garbage-collected
![Page 38: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/38.jpg)
NSURLConnection
- (void) connectionDidFinishLoading:(NSURLConnection*)c
- (void) connection:(NSURLConnection*)c didFailWithError:(NSError *)error
- (void) connection:(NSURLConnection *)c didReceiveData:(NSData *)data
Friday, September 17, 2010
The most-used delegate methods
![Page 39: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/39.jpg)
NSURLConnection
- (void) connection:(NSURLConnection *)c didReceiveData:(NSData *)data {[myData appendData: data];
}
Friday, September 17, 2010
Can accumulate data in memory, but better to send it to a file— don’t know in advance how much data you’ll get
![Page 40: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/40.jpg)
NSURLConnection
- (void) connection:(NSURLConnection *)c didReceiveData:(NSData *)data {[myData appendData: data];
}
- (void) connection:(NSURLConnection *)c didReceiveData:(NSData *)data {[myFileHandle writeData: data];
}
Friday, September 17, 2010
Can accumulate data in memory, but better to send it to a file— don’t know in advance how much data you’ll get
![Page 41: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/41.jpg)
NSURLConnection
- (void) connectionDidFinishLoading:(NSURLConnection*)c{ [myFileHandle synchronizeFile]; NSData *d = [NSData dataWithContentsOfMappedFile: path]; // do something with data...}
Friday, September 17, 2010
Get data when done by using file mapping to let the memory subsystem page bits in and out to save space when it gets tight
![Page 42: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/42.jpg)
NSURLConnection
- (void) connection:(NSURLConnection*)c didFailWithError:(NSError *)error { [myDelegate reportError: error]; // connection will receive no more data}
Friday, September 17, 2010
Report the error to user, logs, other app components, etc.
![Page 43: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/43.jpg)
NSURLConnection
- (NSURLRequest*)connection: willSendRequest:redirectionResponse:
- (void)connection:didReceiveAuthenticationChallenge:- (void)connection:didCancelAuthenticationChallenge:
- (BOOL)connectionShouldUseCredentialStorage:
- (void)connection:didReceiveResponse:- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:- (NSCachedURLResponse*)connection:willCacheResponse:
Friday, September 17, 2010
Other things you can do— observe/change/deny redirectionAuthentication detailsMonitor body data being sent and whether responses are cached (can modify caches)
![Page 44: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/44.jpg)
CFNetwork
• Lower level than NSURLConnection• Finely-grained network operations• Greater control over certain protocols
Friday, September 17, 2010
CFNetwork lets you work around more edge cases than NSURLConnectionStreams are the BOMB
![Page 45: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/45.jpg)
CFNetwork
• Lower level than NSURLConnection• Finely-grained network operations• Greater control over certain protocols• Stream input/output APIs
Friday, September 17, 2010
CFNetwork lets you work around more edge cases than NSURLConnectionStreams are the BOMB
![Page 46: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/46.jpg)
CFNetwork HTTP
- (NSInputStream *) startRequestForURL: (NSURL *) url {CFHTTPMessageRef msg = CFHTTPMessageCreateRequest( NULL, CFSTR(”GET”), (CFURLRef)[url absoluteURL], kCFHTTPVersion1_1);CFHTTPMessageSetHeaderFieldValue(msg, header, value);NSInputStream * s = (NSInputStream*)CFReadStreamCreateForHTTPRequest(msg);return ( [s autorelease] );
}
Friday, September 17, 2010
Create a message ref — analogous to NSURLRequest
![Page 47: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/47.jpg)
CFNetwork HTTP
- (NSInputStream *) startRequestForURL: (NSURL *) url {CFHTTPMessageRef msg = CFHTTPMessageCreateRequest( NULL, CFSTR(”GET”), (CFURLRef)[url absoluteURL], kCFHTTPVersion1_1);CFHTTPMessageSetHeaderFieldValue(msg, header, value);NSInputStream * s = (NSInputStream*)CFReadStreamCreateForHTTPRequest(msg);return ( [s autorelease] );
}
Friday, September 17, 2010
Always provide an absolute URL, it doesn’t handle relative URLs with a base URL well
![Page 48: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/48.jpg)
CFNetwork HTTP
- (NSInputStream *) startRequestForURL: (NSURL *) url {CFHTTPMessageRef msg = CFHTTPMessageCreateRequest( NULL, CFSTR(”GET”), (CFURLRef)[url absoluteURL], kCFHTTPVersion1_1);CFHTTPMessageSetHeaderFieldValue(msg, header, value);NSInputStream * s = (NSInputStream*)CFReadStreamCreateForHTTPRequest(msg);return ( [s autorelease] );
}
Friday, September 17, 2010
Can set HTTP header field values just like NSURLRequest
![Page 49: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/49.jpg)
CFNetwork HTTP
- (NSInputStream *) startRequestForURL: (NSURL *) url {CFHTTPMessageRef msg = CFHTTPMessageCreateRequest( NULL, CFSTR(”GET”), (CFURLRef)[url absoluteURL], kCFHTTPVersion1_1);CFHTTPMessageSetHeaderFieldValue(msg, header, value);NSInputStream * s = (NSInputStream*)CFReadStreamCreateForHTTPRequest(msg);return ( [s autorelease] );
}
Friday, September 17, 2010
Get a stream from it— but remember to autorelease, since it comes from a CF Create API
![Page 50: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/50.jpg)
CFNetwork FTP
CFReadStreamRef reader = NULL;CFURLRef url = /* ftp://ftp.cdrom.com/public/os/linux/ */;reader = CFReadStreamCreateWithFTPURL(NULL, url);
CFReadStreamOpen( reader );CFReadStreamRead( ... );... // receive all the data
Friday, September 17, 2010
FTP gives very simple access to FTP servers
![Page 51: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/51.jpg)
CFNetwork FTP
CFReadStreamRef reader = NULL;CFURLRef url = /* ftp://ftp.cdrom.com/public/os/linux/ */;reader = CFReadStreamCreateWithFTPURL(NULL, url);
CFReadStreamOpen( reader );CFReadStreamRead( ... );... // receive all the data
CFDictionaryRef dirListing = NULL;CFFTPCreateParsedResourceListing(NULL, dataBuf, dataLen, &dirListing);
Friday, September 17, 2010
Including parsing out the contents of directory listings
![Page 52: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/52.jpg)
CFNetwork FTP
CFDictionaryRef dirListing = NULL;CFFTPCreateParsedResourceListing(NULL, dataBuf, dataLen, &dirListing);
kCFFTPResourceMode ...Name ...Owner ...Group ...Link ...Size ...Type ...ModDate
Friday, September 17, 2010
Parsed dir listings let you inspect resource attributes via the parsed dictionary
![Page 53: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/53.jpg)
CFNetwork Sockets
CFReadStreamRef input = NULL;CFWriteStreamRef output = NULL;
CFStreamCreatePairWithSocketToCFHost(NULL, aCFHostRef, aPort, &input, &output);
CFStreamCreatePairWithSocketToNetService(NULL, aServiceRef, &input, &output);
Friday, September 17, 2010
Can be used to create streams from socket connection informationIncluding NetServices (Bonjour)
![Page 54: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/54.jpg)
NSNetwork Sockets
NSInputStream * input = nil;NSOutputStream * output = nil;
[NSStream getStreamsToHost: anNSHost port: aPort inputStream: &input outputStream: &output];
[anNSNetService getInputStream: &input outputStream: &output];
Friday, September 17, 2010
…but NSStream/NSNetService provide analogous and simpler ways of doing the same.
![Page 55: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/55.jpg)
CFNetwork Sockets
kCFStreamPropertySSLSettings- kCFStreamPropertySSLPeerTrust- kCFStreamSSLValidatesCertificateChain- kCFStreamSSLLevel- kCFStreamSSLPeerName- kCFStreamSSLAllowsExpiredCertificates- kCFStreamSSLAllowsExpiredRoots
kCFStreamPropertySOCKSProxyHostkCFStreamPropertySOCKSProxyPortkCFStreamPropertySOCKSVersionkCFStreamPropertySOCKSUserkCFStreamPropertySOCKSPassword
Friday, September 17, 2010
CF versions support much more fine-grained propertiese.g. SSL peer name— virtual host whose server certificate doesn’t match its nameCan set the expected certificate name so it won’t fail to validate like NSURLConnection would
![Page 56: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/56.jpg)
Using Streams
- (void) startStreaming { [myStream open];}
- (void) stopStreaming { [myStream close];}
Friday, September 17, 2010
Streams are simple to use— open/close them
![Page 57: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/57.jpg)
Using Streams
- (void) stream:(NSStream*)stream handleEvent:(NSStreamEvent)event { switch ( event ) { case NSStreamEventOpenCompleted: ... case NSStreamEventHasBytesAvailable: ... case NSStreamEventHasSpaceAvailable: ... case NSStreamEventErrorOccurred: ... case NSStreamEventEndEncountered: ... }}
Friday, September 17, 2010
Single delegation callback with five eventsHasBytes/HasSpace are only for Input/Output streams respectively
![Page 58: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/58.jpg)
Using Streams
switch ( event ) { case NSStreamEventOpenCompleted: [self postConnectedNotification]; break; ...}
Friday, September 17, 2010
When it opens you can assume that data or error will happen, so can notify other components or the user
![Page 59: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/59.jpg)
Using Streams
switch ( event ) { case NSStreamEventHasBytesAvailable: uint8_t buf[1024]; int len = [stream read: buf maxLength: 1024]; if ( len > 0 ) ... break; ...}
Friday, September 17, 2010
When bytes are available, read using a simple API. Read as much or as little as you want— API returns the amount actually read.
![Page 60: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/60.jpg)
Using Streams
switch ( event ) { case NSStreamEventHasSpaceAvailable: uint8_t *buf = [myData bytes] + numSent; int numLeft = [myData length] - numSent; int len = [stream write:buf length:numLeft]; if ( len > 0 ) numSent += len; break; ...}
Friday, September 17, 2010
When an output stream has space to send, you can write as much as you likeIt will tell you how much it was able to send
![Page 61: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/61.jpg)
Using Streams
switch ( event ) { case NSStreamEventErrorOccurred: [self postErrorNotification:[stream streamError] forStream:stream]; self.complete = YES; break; ...}
Friday, September 17, 2010
If an error occurs, you can get the NSError from the streamStream operations are now complete— an error is one which prevents further use of the stream
![Page 62: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/62.jpg)
Using Streams
switch ( event ) { case NSStreamEventEndEncountered: self.complete = YES; [self handleDownloadedData]; break; ...}
Friday, September 17, 2010
When you reach the end of the stream, you can’t use it any more (no seeking on standard streams)
![Page 63: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/63.jpg)
Case Study: Outpost
Friday, September 17, 2010
![Page 64: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/64.jpg)
NSURLConnection
Friday, September 17, 2010
Started out using NSURLConnection. Found ridiculously large files from server.NSURLConnection’s internals were creating some buffersStoring downloaded data in memory before parsing it = bad
![Page 65: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/65.jpg)
NSURLConnection
• Large XML !les. Very large XML !les
Friday, September 17, 2010
Started out using NSURLConnection. Found ridiculously large files from server.NSURLConnection’s internals were creating some buffersStoring downloaded data in memory before parsing it = bad
![Page 66: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/66.jpg)
NSURLConnection
• Large XML !les. Very large XML !les• High memory consumption from NSURL protocol
buffers
Friday, September 17, 2010
Started out using NSURLConnection. Found ridiculously large files from server.NSURLConnection’s internals were creating some buffersStoring downloaded data in memory before parsing it = bad
![Page 67: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/67.jpg)
NSURLConnection
• Large XML !les. Very large XML !les• High memory consumption from NSURL protocol
buffers• Download then parse
Friday, September 17, 2010
Started out using NSURLConnection. Found ridiculously large files from server.NSURLConnection’s internals were creating some buffersStoring downloaded data in memory before parsing it = bad
![Page 68: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/68.jpg)
NSURLConnection + memory-mapped !les
Friday, September 17, 2010
Write out data to disk, then map into memoryOnly pages out when memory gets full— so memory still fills upMany concurrent similar tasks can prevent this working, causing Low Memory crashes still
![Page 69: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/69.jpg)
NSURLConnection + memory-mapped !les
• +[NSData dataWithContentsOfMappedFile:]
Friday, September 17, 2010
Write out data to disk, then map into memoryOnly pages out when memory gets full— so memory still fills upMany concurrent similar tasks can prevent this working, causing Low Memory crashes still
![Page 70: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/70.jpg)
NSURLConnection + memory-mapped !les
• +[NSData dataWithContentsOfMappedFile:]• Reduces in-memory footprint, but only until
memory limit is reached
Friday, September 17, 2010
Write out data to disk, then map into memoryOnly pages out when memory gets full— so memory still fills upMany concurrent similar tasks can prevent this working, causing Low Memory crashes still
![Page 71: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/71.jpg)
NSURLConnection + memory-mapped !les
• +[NSData dataWithContentsOfMappedFile:]• Reduces in-memory footprint, but only until
memory limit is reached• Data still takes some time to download
Friday, September 17, 2010
Write out data to disk, then map into memoryOnly pages out when memory gets full— so memory still fills upMany concurrent similar tasks can prevent this working, causing Low Memory crashes still
![Page 72: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/72.jpg)
NSURLConnection + memory-mapped !les
• +[NSData dataWithContentsOfMappedFile:]• Reduces in-memory footprint, but only until
memory limit is reached• Data still takes some time to download• Still downloading then parsing
Friday, September 17, 2010
Write out data to disk, then map into memoryOnly pages out when memory gets full— so memory still fills upMany concurrent similar tasks can prevent this working, causing Low Memory crashes still
![Page 73: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/73.jpg)
NSURLConnection + Streaming XML Parser
Friday, September 17, 2010
Download slowly to disk, but then *stream* from disk into a new XML parserLow in-memory footprint, only loads 1K at a time into RAM to parseXML parser cleans its working heap more often (every 1K opp. to just once at the end)
![Page 74: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/74.jpg)
NSURLConnection + Streaming XML Parser
• Large !les will always take a long time to download
Friday, September 17, 2010
Download slowly to disk, but then *stream* from disk into a new XML parserLow in-memory footprint, only loads 1K at a time into RAM to parseXML parser cleans its working heap more often (every 1K opp. to just once at the end)
![Page 75: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/75.jpg)
NSURLConnection + Streaming XML Parser
• Large !les will always take a long time to download
• Very low in-memory footprint
Friday, September 17, 2010
Download slowly to disk, but then *stream* from disk into a new XML parserLow in-memory footprint, only loads 1K at a time into RAM to parseXML parser cleans its working heap more often (every 1K opp. to just once at the end)
![Page 76: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/76.jpg)
NSURLConnection + Streaming XML Parser
• Large !les will always take a long time to download
• Very low in-memory footprint• Stream from !le to XML parser
Friday, September 17, 2010
Download slowly to disk, but then *stream* from disk into a new XML parserLow in-memory footprint, only loads 1K at a time into RAM to parseXML parser cleans its working heap more often (every 1K opp. to just once at the end)
![Page 77: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/77.jpg)
NSURLConnection + Streaming XML Parser
• Large !les will always take a long time to download
• Very low in-memory footprint• Stream from !le to XML parser• Still downloading then parsing
Friday, September 17, 2010
Download slowly to disk, but then *stream* from disk into a new XML parserLow in-memory footprint, only loads 1K at a time into RAM to parseXML parser cleans its working heap more often (every 1K opp. to just once at the end)
![Page 78: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/78.jpg)
CFHTTPStream + Streaming XML Parser
Friday, September 17, 2010
Using CFNetwork we get a stream from the serverFeeds into the XML parser as the data arrives from the serverWhen all data is received, 95% or more of parsing is already doneAsynchronously handling data and network = WIN
![Page 79: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/79.jpg)
CFHTTPStream + Streaming XML Parser
• Download still takes a long time BUT:
Friday, September 17, 2010
Using CFNetwork we get a stream from the serverFeeds into the XML parser as the data arrives from the serverWhen all data is received, 95% or more of parsing is already doneAsynchronously handling data and network = WIN
![Page 80: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/80.jpg)
CFHTTPStream + Streaming XML Parser
• Download still takes a long time BUT:• Memory usage is minimal
Friday, September 17, 2010
Using CFNetwork we get a stream from the serverFeeds into the XML parser as the data arrives from the serverWhen all data is received, 95% or more of parsing is already doneAsynchronously handling data and network = WIN
![Page 81: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/81.jpg)
CFHTTPStream + Streaming XML Parser
• Download still takes a long time BUT:• Memory usage is minimal• Parses and collates data while downloading
Friday, September 17, 2010
Using CFNetwork we get a stream from the serverFeeds into the XML parser as the data arrives from the serverWhen all data is received, 95% or more of parsing is already doneAsynchronously handling data and network = WIN
![Page 82: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/82.jpg)
CFHTTPStream + Streaming XML Parser
• Download still takes a long time BUT:• Memory usage is minimal• Parses and collates data while downloading• Maybe an extra 1%-5% of total download time
before all tasks are complete
Friday, September 17, 2010
Using CFNetwork we get a stream from the serverFeeds into the XML parser as the data arrives from the serverWhen all data is received, 95% or more of parsing is already doneAsynchronously handling data and network = WIN
![Page 83: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/83.jpg)
Stepping back…
Friday, September 17, 2010
Now let’s look back at something we saw earlier
![Page 84: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/84.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
- (void) networkCall { dispatch_async(q, ^{ MySyncNetworkCall(); }}
Friday, September 17, 2010
We saw this…
![Page 85: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/85.jpg)
void MySyncNetworkCall { int s = socket(...); if (!connect(s, ...)) { ... } close(s);}
- (void) networkCall { dispatch_async(q, ^{ MySyncNetworkCall(); }}
Friday, September 17, 2010
…and this is the interesting bit
![Page 86: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/86.jpg)
^
Friday, September 17, 2010
Caret character is where the magic liesCaret = blocks
![Page 87: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/87.jpg)
Blocks
Friday, September 17, 2010
Caret character is where the magic liesCaret = blocks
![Page 88: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/88.jpg)
Do block n times
typedef void (^work_t)(void);
voidrepeat(int n, work_t work) { for (int i = 0; i < n; i++) work();}
Friday, September 17, 2010
Provides a way to encapsulate work without needing to define functions and pass/retain variables used by that work
![Page 89: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/89.jpg)
Why Blocks?
• Smaller, easier, more precise code• Encapsulates variables from enclosing scope
(closures)• More than 100 uses of blocks in Snow Leopard
and iOS4 APIs• Callbacks• Concurrency• Traditional ‘collection’ uses: iterate, map,
reduce, wrap
Friday, September 17, 2010
Blocks let you skip the setup associated with most work-queue implementations (variables, context pointers) by copying enclosing scopeUsed everywhere in OS X 10.6 and and iOS4Has many different use-cases
![Page 90: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/90.jpg)
Grand Central Dispatch
Friday, September 17, 2010
Blocks were created so that GCD could happen
![Page 91: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/91.jpg)
Asynchronous Blocks
Friday, September 17, 2010
GCD lets you run blocks of work asynchronously
![Page 92: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/92.jpg)
Asynchronous Blocks
• Provides serial and concurrent queues, semaphores, timers, event sources and more
• Utilizes highly efficient user-space atomic locking mechanisms• Avoids kernel traps in the case where resources
are not in contention from multiple threads• 95+% of the time
Friday, September 17, 2010
GCD provides serial and concurrent queues to which you can dispatch discrete work blocksHighly efficient user-space locking mechanism avoids trapping to the kernel unless resource is actually contended, which is actually fairly rare
![Page 93: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/93.jpg)
Stacking up
Application
Kernel
Grand Central Dispatch
Friday, September 17, 2010
GCD is in user-space, but acts as an optional layer between the app and the kernel
![Page 94: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/94.jpg)
Fast local dispatchApplication
Kernel
Grand Central Dispatch
dispatch_semaphore_signal:lock incq 0x38(%rdi)jle _dispatch_semaphore_signal_slowxor %eax, %eaxret
System Call
Friday, September 17, 2010
GCD semaphores try to assume that resources are not contendedWhen they aren’t contended, the routine can perform a very fast atomic operation and returnWhen they are contended, it will trap to the kernel — but ONLY then
![Page 95: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/95.jpg)
200xFriday, September 17, 2010
Gives quite a speed-up
![Page 96: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/96.jpg)
dispatch_async(queue, ^{ printf(“Hello\n”);});
Friday, September 17, 2010
It’s as simple as this
![Page 97: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/97.jpg)
Overview
• GCD is part of libSystem• Available to all applications• #include <dispatch/dispatch.h>
• C, but uses object-oriented approach• Uses reference-counted memory management• Most APIs use a fast local path and make system
calls only when necessary
Friday, September 17, 2010
Automatically included in all apps via libSystemPseudo-object system with polymorphismReference-counted— doesn’t use garbage collection yetAPIs use fast local paths and trap to kernel only if necessary
![Page 98: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/98.jpg)
Component APIs• Objects
• Similar to CF’s polymorphic API• Queues
• Pass blocks or functions to run on a queue• Semaphores
• Fast, lightweight counted semaphores• Groups
• Collect blocks/functions, for noti!cation• Sources
• Monitor !les, ports, signals using blocks
Friday, September 17, 2010
Polymorphic object API implements queues, semaphores, groups (of blocks) to monitor async or sync, and event sources for file descriptors, signals, basic integer operations, and more
![Page 99: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/99.jpg)
Queues
Friday, September 17, 2010
Queues first
![Page 100: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/100.jpg)
Queues
• Provides a low-level yet almost API-free means of creating and dispatching concurrent tasks
• Very fast, using local (user-space) locking for enqueue and dequeue operations
• Can be used to synchronize access to any resource or method
• Very easy to run any snippet of code either in ‘the background’ or on the main thread
Friday, September 17, 2010
Very simple API. A queue is also very small, so you can create lots and lots of themCan be used for concurrency or resource access synchronization
![Page 101: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/101.jpg)
From Sync to Async
- (void) myFunction { [self openDocument]; [self processDocument]; [self displayDocument];}
Friday, September 17, 2010
Making a sync function async with dispatch queues
![Page 102: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/102.jpg)
From Sync to Async- (void) myFunction { [self openDocument]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self processDocument]; [self displayDocument]; });}
Friday, September 17, 2010
First grab the long-running bit and run in the background on a global (concurrent) queue
![Page 103: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/103.jpg)
From Sync to Async- (void) myFunction { [self openDocument]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self processDocument]; dispatch_async(dispatch_get_main_queue(), ^{ [self displayDocument]; }); });}
Friday, September 17, 2010
That work block, when done, submits the final step to the main-thread’s serial queueVery simple to run code on the main thread with GCD
![Page 104: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/104.jpg)
Lock-free Synchronization
- (void) addInterest:(float)rate { float newAmount = _amount * rate; _amount = base;}
Friday, September 17, 2010
Resource access synchronizationThread could be preempted between those two linesSecondary thread runs this codeFirst thread overwrites second thread’s result = lost calculation
![Page 105: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/105.jpg)
Lock-free Synchronization
- (void) addInterest:(float)rate { dispatch_async(_myQueue, ^{ float newAmount = _amount * rate; _amount = base; });}
Friday, September 17, 2010
By dispatching to your own queue (all of your own queues are serial in nature) you can ensure that the two events happen in order and complete before any other thread’s versionEven under high contention, one is guaranteed to beat the other into the queue, guaranteeing synchronized access
![Page 106: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/106.jpg)
Lock-free Synchronization
- (void) addInterest:(float)rate { dispatch_sync(_myQueue, ^{ float newAmount = _amount * rate; _amount = base; });}
Friday, September 17, 2010
Can also run synchronously if the API contract requires that the function not return until the work is doneBe careful— will deadlock if current code is already running on _myQueue
![Page 107: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/107.jpg)
Lock-free Initialization
+ (id) sharedObject { if (__sharedInstance == nil) { __sharedInstance = [[self alloc] init]; } return (__sharedInstance);}
Friday, September 17, 2010
Initializing singletons— this might get preempted and create two instances, losing reference to first
![Page 108: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/108.jpg)
Lock-free Initialization
+ (id) sharedObject { static dispatch_once_t onceControl = 0; dispatch_once(&onceControl, ^{ __sharedInstance = [[self alloc] init]; }); return (__sharedInstance);}
Friday, September 17, 2010
Use dispatch_once to run something only once per *process*Atomic locking ensures this code will definitely only run once. Avoids CPU speculative look-ahead and instruction re-ordering.
![Page 109: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/109.jpg)
Event Sources
Friday, September 17, 2010
Event sources— great for networking
![Page 110: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/110.jpg)
GCD Event Sources
• Your new best friend — dispatch_source_t• Implements a cleaner way of handling
asynchronous (and ordered) events on network streams, amongst other things
• Based on the kevent() API, but hides that complexity from you
Friday, September 17, 2010
Use it. Use it a lot.Asynchronous event handling, optionally in an ordered fashion depending on the source’s target queueHides implementation details from you
![Page 111: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/111.jpg)
For the network
- (void) setupSockets { int s = socket(...); cfSocket = CFSocketCreateWithNative(s,...); CFSocketEnableCallbacks(cfSocket, ...); CFSocketConnectToAddress(cfSocket, ...);}void MyCFSocketCallback(...) { switch (type) { ... }}
Friday, September 17, 2010
Could create sockets and connect like thisNeeds a separate callback function, context, switch on event types, etc.
![Page 112: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/112.jpg)
For the network
- (void) setupSockets { int s = socket(...); rSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_READ, s, 0); dispatch_source_set_event_handler(rSrc, ^{ uint8_t buf[1024]; int len = read(s, buf, 1024); if (len > 0) ... });}
Friday, September 17, 2010
This way you can create a source for readability, one for writability, and have events for eachSet and event handler with this API, handing in a work block
![Page 113: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/113.jpg)
For the network
- (void) setupSockets { int s = socket(...); rSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_READ, s, 0); dispatch_source_set_event_handler(rSrc, ^{ uint8_t buf[1024]; int len = read(s, buf, 1024); if (len > 0) ... });}
Friday, September 17, 2010
Code to handle each event is in-line with the rest of network setup code, which makes maintenance easier
![Page 114: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/114.jpg)
For UI updates
• The ‘data add’ source is perfect for progress updates
• Provides a simple way to atomically accumulate a numeric value
• Anything can update the source, and the events are run on a queue designated by the source’s creator
Friday, September 17, 2010
Updating UI is easy too — for instance showing progress of a download/upload or other determinate time-consuming operation
![Page 115: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/115.jpg)
For UI updates
- (void) setupProgressWithMax:(float)max { progSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0); dispatch_set_target_queue(progSrc, dispatch_get_main_queue()); dispatch_source_set_event_handler(progSrc, ^{ int d = dispatch_source_get_data(progSrc); _progressView.progress = (float)d / max; });}
Friday, September 17, 2010
Create a source of type ‘data add’Accumulates an integer value based on values handed in from any other thread/queue/code
![Page 116: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/116.jpg)
For UI updates
- (void) setupProgressWithMax:(float)max { progSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0); dispatch_set_target_queue(progSrc, dispatch_get_main_queue()); dispatch_source_set_event_handler(progSrc, ^{ int d = dispatch_source_get_data(progSrc); _progressView.progress = (float)d / max; });}
Friday, September 17, 2010
Set its target queue— for UI, can have it run on the main threadDon’t need to be on the main thread to set this up at all
![Page 117: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/117.jpg)
For UI updates
- (void) setupProgressWithMax:(float)max { progSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0); dispatch_set_target_queue(progSrc, dispatch_get_main_queue()); dispatch_source_set_event_handler(progSrc, ^{ int d = dispatch_source_get_data(progSrc); _progressView.progress = (float)d / max; });}
Friday, September 17, 2010
Set the event handler just like before— again, handler code is inline making maintenance easier
![Page 118: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/118.jpg)
For UI updates
- (void) setupProgressWithMax:(float)max { progSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0); dispatch_set_target_queue(progSrc, dispatch_get_main_queue()); dispatch_source_set_event_handler(progSrc, ^{ int d = dispatch_source_get_data(progSrc); _progressView.progress = (float)d / max; });}
Friday, September 17, 2010
Get current accumulated value through this APIOnly call it from within a source’s event block
![Page 119: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/119.jpg)
For UI updates
- (void) setupProgressWithMax:(float)max { progSrc = dispatch_source_create( DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0); dispatch_set_target_queue(progSrc, dispatch_get_main_queue()); dispatch_source_set_event_handler(progSrc, ^{ int d = dispatch_source_get_data(progSrc); _progressView.progress = (float)d / max; });}
Friday, September 17, 2010
It’s a closure, so you don’t need to keep max value around anywhere, the blocks runtime does it for you
![Page 120: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/120.jpg)
For UI updates
- (void) receivedData:(NSData*)data { dispatch_source_merge_data(progSource, [data length]);}
Friday, September 17, 2010
To update the source, your other code just needs to use this API to hand in a value to the accumulatorThe event handler will not be queued if it is already present on its target queueMany merges can happen while target queue is busy, single event handler gets *current* value
![Page 121: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/121.jpg)
Availability
Friday, September 17, 2010
Tempting to use Reachability APIs the wrong way
![Page 122: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/122.jpg)
Don’t call us, we’ll call you
• Do:1. Attempt to use the network2. Check the error value
Friday, September 17, 2010
Do’s and don’ts— should use network first and check error, not test for reachability first
![Page 123: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/123.jpg)
Don’t call us, we’ll call you
• Do:1. Attempt to use the network2. Check the error value
• Don’t:1. Check availability !rst2. Use network if available
Friday, September 17, 2010
Do’s and don’ts— should use network first and check error, not test for reachability first
![Page 124: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/124.jpg)
• Reachability APIs describe the network state as it is now.
• Network connections are dropped automatically by the OS when they haven’t been used for a while
• May have 3G available but not powered up
• May have a WiFi network nearby
• The WiFi network might need user interaction to initiate a connection
Friday, September 17, 2010
Reachability returns the truth— and network hardware might simply not be connectedDoesn’t mean it can’t connect— means it hasn’t done so already
![Page 125: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/125.jpg)
• Assume the network is available— try to use it• The OS will attempt to raise a WWAN or WiFi
connection• Presents WiFi choices if in a WiFi app• Prompts for passwords• Presents modal dialog for captive network
logon
The Right Way
Friday, September 17, 2010
Just Do ItSystem handles all the details of making the network connectionOnly works if you use CFNetwork or higherWrap BSD sockets in CFSocketRef, use CFSocketConnectToAddress()
![Page 126: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/126.jpg)
• Assume the network is available— try to use it• The OS will attempt to raise a WWAN or WiFi
connection• Presents WiFi choices if in a WiFi app• Prompts for passwords• Presents modal dialog for captive network
logon• Note: automatic network hardware bringup
requires the use of CFNetwork or ObjC networking APIs (not raw BSD sockets).
The Right Way
Friday, September 17, 2010
Just Do ItSystem handles all the details of making the network connectionOnly works if you use CFNetwork or higherWrap BSD sockets in CFSocketRef, use CFSocketConnectToAddress()
![Page 127: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/127.jpg)
The Right Way
• If a connection is established, your call goes through transparently
• If the connection fails, you’ll receive an error• Error codes are found in:
• <Foundation/NSURLErrors.h>• <CFNetwork/CFNetworkErrors.h>
• If the error indicates ‘no internet’ or ‘no connection’, then proceed to Plan B
Friday, September 17, 2010
It Just WorksIf no network, you’ll hear about itNOW you can install a reachability observer
![Page 128: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/128.jpg)
Plan B• Your network connection failed• Now you can install a reachability monitor
• This will tell you when the network status changes
• A positive reachability noti!cation only means you might be able to use the network, not can use it
• It’s a good idea to periodically retry your network calls to potentially prompt a connection• The network only goes up on request, and
there’s no guarantee that another application will cause that to happen
Friday, September 17, 2010
Observer will tell you that it’s worth *trying* to connect again, doesn’t guarantee successIf nothing else on system tries to use network, no connection will happenWorthwhile to retry occasionally to make system attempt connection again
![Page 129: Fit c Mobile 2010](https://reader034.vdocuments.mx/reader034/viewer/2022051616/557211d5497959fc0b8f90aa/html5/thumbnails/129.jpg)
Jim DoveyiTeam Lead DeveloperKobo Inc.http://alanquatermain.net
Optimized Networking and Data Handling in iOS 4
Friday, September 17, 2010
That’s All Folks— questions?