рдиреЗрдЯрд┐рд╡ NSInputStream рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рд╕реБрдкрд░рд╕реЛрдирд┐рдХ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛



рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдлрд╝реЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдВрднрд╡ рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП Cloud.Ru Mail.Ru рдореЛрдмрд╛рдЗрд▓ рдРрдк рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдЧреИрд▓рд░реА рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рдлреЛрди рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдХрдИ рдмрд╛рд░ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдореЗрд▓ рд╕реЗ рддрд╕реНрд╡реАрд░реЗрдВ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдХреНрд▓рд╛рдЙрдб рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рди рдХреЗрд╡рд▓ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрджрд░реНрд╢ рдХреЗ рдХрд░реАрдм рд╣реИред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реА POSInputStreamLibrary рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдереА, рдЬреЛ iOS рд╕рд┐рд╕реНрдЯрдо рдЧреИрд▓рд░реА рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдлрд╝реЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред ALAssetLibrary рдФрд░ CFNetwork рдЪреМрдЦрдЯреЗ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдШрдирд┐рд╖реНрда рдПрдХреАрдХрд░рдг рдХреЗ рдХрд╛рд░рдг, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдПрдХ рдмрд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ iOS рдбреЗрд╡рд▓рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ NSInputStream рд╡рд░реНрдЧ рдХреЗ рдЕрдкрдиреЗ рд╡рдВрд╢рдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

Mail.Ru рдХреНрд▓рд╛рдЙрдб рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреЗ рджреМрд░рд╛рди, POSBlobInputStream рд╕реНрдЯреНрд░реАрдо рдиреЗ рдмрд╣реБрдд рд╕рдореГрджреНрдз рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реИ:


рдЗрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрд░реНрде рдПрдХ рдЕрд▓рдЧ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдореБрдЦреНрдп рдХреЛрдХреЛрдЖ рднрдВрдбрд╛рд░ рднреА рд╣реИ ред

URL рдлрд╝реНрд▓реЛ рдПрд▓реЗрд╕реЗрдЯ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛


рдЬрдм рддрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдлрд╝реЛрдЯреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдереА, рддрдм рддрдХ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ред рдЧреИрд▓рд░реА рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдорд╛рдирдХ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдИ рдЧрдИ рдереАред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП NSURLRequest рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

 @interface NSInputStream (NSInputStreamExtensions) // ... + (id)inputStreamWithFileAtPath:(NSString *)path; // ... @end 

 @interface NSMutableURLRequest (NSMutableHTTPURLRequest) // ... - (void)setHTTPBodyStream:(NSInputStream *)inputStream; // ... @end 

рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп:



рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛ рджрд┐рдпрд╛ред рд░реЛрд▓рд░реНрд╕ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реБрдИрдВ:


рдЗрди рдЕрд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, POSBlobInputStream рд╡рд░реНрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЧреИрд▓рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ URL рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рд╣реИ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рдкрдврд╝рддрд╛ рд╣реИред

 @interface NSInputStream (POS) + (NSInputStream *)pos_inputStreamWithAssetURL:(NSURL *)assetURL; + (NSInputStream *)pos_inputStreamWithAssetURL:(NSURL *)assetURL asynchronous:(BOOL)asynchronous; + (NSInputStream *)pos_inputStreamForCFNetworkWithAssetURL:(NSURL *)assetURL; @end 

рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп:



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ POSBlobInputStream рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддреБрдЪреНрдЫ рд╣реИред

 @interface NSInputStream : NSStream - (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len; - (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len; - (BOOL)hasBytesAvailable; @end 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, getBuffer:length: рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 2 рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред ALAssetRepresentation рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЙрдирдХреА рдореИрдкрд┐рдВрдЧ рдиреЗ ALAssetRepresentation рдкреНрд░рд╢реНрди рдирд╣реАрдВ рдЙрдард╛рдпрд╛ред

 @interface ALAssetRepresentation : NSObject // ... - (long long)size; - (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error; // ... @end 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирдП рдмрдиреЗ POSBlobInputStream рдХреЛ рдкрд╛рдиреА рдореЗрдВ POSBlobInputStream , рдореБрдЭреЗ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖред NSStream рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдлреЙрд░реНрдо рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛:
 *** -propertyForKey: only defined for abstract class. Define -[POSBlobInputStream propertyForKey:] 

рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ NSInputStream рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ init рд╡рд┐рдзрд┐рдпрд╛рдБ NSInputStream рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА NSStream рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд░рд╛ рд╣реИред

 @interface NSStream : NSObject - (void)open; - (void)close; - (id <NSStreamDelegate>)delegate; - (void)setDelegate:(id <NSStreamDelegate>)delegate; - (id)propertyForKey:(NSString *)key; - (BOOL)setProperty:(id)property forKey:(NSString *)key; - (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; - (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; - (NSStreamStatus)streamStatus; - (NSError *)streamError; @end 

рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ POSBlobInputStream рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб


POSBlobInputStream рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ POSBlobInputStream рд╕рдмрд╕реЗ рдХрдард┐рди POSBlobInputStream рдПрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред NSStream scheduleInRunLoop:forMode: removeFromRunLoop:forMode: scheduleInRunLoop:forMode: removeFromRunLoop:forMode: рдФрд░ setDelegate: рд╡рд┐рдзрд┐рдпрд╛рдБ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдкреНрд░рд╡рд╛рд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрджреНрдШрд╛рдЯрди рдХреЗ рд╕рдордп рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдмрд╛рдЗрдЯ рдирд╣реАрдВ рд╣реИред POSBlobInputStream рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рддрд╛ рд╣реИ:


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд POSBlobInputStream рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЪреЗрдХрд╕рдо рдЧрдгрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЖрдЗрдП рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред

 NSInputStream *stream = [NSInputStream pos_inputStreamWithAssetURL:assetURL asynchronous:NO]; [stream open]; if ([stream streamStatus] == NSStreamStatusError) { /*    */ return; } NSParameterAssert([stream streamStatus] == NSStreamStatusOpen); while ([stream hasBytesAvailable]) { uint8_t buffer[kBufferSize]; const NSInteger readCount = [stream read:buffer maxLength:kBufferSize]; if (readCount < 0) { /*    */ return; } else if (readCount > 0) { /*     */ } } if ([stream streamStatus] != NSStreamStatusAtEnd) { /*    */ return; } [stream close]; 

рдЕрдкрдиреА рд╕рднреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рдЕрджреГрд╢реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрддрд┐рд░реЛрдз рд╣реЛрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЦреБрд▓реА рд╡рд┐рдзрд┐ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдИрдУрдПрд╕ рдПрд╕рдбреАрдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ ALAsset рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ ALAsset рд╣реИред рдпрджрд┐ open рдХрд╛рд░реНрдп рдХреЛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЧрддрд┐рд░реЛрдз рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдзрд╛рд░рд╛ рдХреЗ рд╕рдордХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА, рдиреАрдЪреЗ рдЕрдиреБрднрд╛рдЧ "NSURLRequest рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ" рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЪреЗрдХрд╕рдо рдЧрдгрдирд╛ рдХрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддрд╛ рд╣реИред

 @interface ChecksumCalculator () <NSStreamDelegate> @end @implementation ChecksumCalculator - (void)calculateChecksumForStream:(NSInputStream *)aStream { aStream.delegate = self; [aStream open]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; [aStream scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode]; for (;;) { @autoreleasepool { if (![runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:kRunLoopInterval]]) { break; } const NSStreamStatus streamStatus = [aStream streamStatus]; if (streamStatus == NSStreamStatusError || streamStatus == NSStreamStatusClosed) { break; } }} }); } #pragma mark - NSStreamDelegate - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { switch (eventCode) { case NSStreamEventHasBytesAvailable: { [self updateChecksumForStream:aStream]; } break; case NSStreamEventEndEncountered: { [self notifyChecksumCalculationCompleted]; [_stream close]; } break; case NSStreamEventErrorOccurred: { [self notifyErrorOccurred:[_stream streamError]]; [_stream close]; } break; } } @end 

ChecksumCalculator рдЦреБрдж рдХреЛ POSBlobInputStream рдИрд╡реЗрдВрдЯ POSBlobInputStream рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдзрд╛рд░рд╛ рдореЗрдВ рдирдпрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдзрд╛рдЧрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реВрдЪреА рдореЗрдВ, рд╡реЗ GCD рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдЖрдПрдВрдЧреЗред

ALAssetLibrary рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


ALAssetLibrary рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



NSURLRequest рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ iOS SDK рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрддрд░ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ NSURLRequest рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди CFNetwork рдврд╛рдВрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рд▓рдВрдмреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдВрдХрд╛рд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд▓рдорд╛рд░рд┐рдпрд╛рдБ рдЬрдорд╛ рдХреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗред

NSInputStream " рдЯреЛрд▓-рдлреНрд░реА NSInputStream " iOS SDK рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдк рдЗрд╕реЗ CFReadStreamRef рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрдкрддреНрддрд┐ NSURLRequest рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреА рд╣реИред рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЕрдкрдиреЗ рдЬреБрдбрд╝рд╡рд╛рдВ рднрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ POSBlobInputStream рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реА- POSBlobInputStream рд╕реА-рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, NSInputStream рд╕рднреА C- рдХреЙрд▓ рдХреЛ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд NSInputStream рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХреЙрд▓ рдХреЗ NSInputStream рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреЛ рдЧрдВрднреАрд░ рд╡рд┐рдЪрд▓рди рд╣реИрдВ:

  1. рд╕рднреА рдХреЙрд▓ рдЕрдиреБрдорд╛рдирд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдЪреНрдЫреЗ рд▓реЗрдЦ рд╣реИрдВ: рдХреЛрд░рдлрд╛рдЙрдВрдбреЗрд╢рди рдЯреЛрд▓-рдлреНрд░реА рдмреНрд░рд┐рдЬреЗрдЯ NSInputStream , рд╕рдмрдХреНрд▓рд╛рд╕рд┐рдВрдЧ NSInputStream рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ ред
  2. Proxying CFReadStreamGetError рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреНрд░реИрд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЬреНрдЮрд╛рди рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░реИрд╢ рд▓реЙрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ CFStream рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рд▓рдЧрд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╕рдВрдХреЗрддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреБрд░рд╛рдирд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рддрдХ рд╕реАрдПрдлрдПрди рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдирд╣реАрдВ рдорд┐рдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рднреА NSInputStream рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ CFNetwork рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рджреБрдЦрдж рд╣реИред

рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ CFNetwork рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╢рддреНрд░реБрддрд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рднрдбрд╝рдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред CFNetwork рдХреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрд╕реЗ рдЗрд╕рдХреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рди рдХрд░реЗрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, POSBlobInputStream рдкреНрд░реЙрдкрд░реНрдЯреА shouldNotifyCoreFoundationAboutStatusChange ред рдпрджрд┐ рдзреНрд╡рдЬ рд╕реЗрдЯ рд╣реИ, рддреЛ:

  1. рдереНрд░реЗрдб C рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реВрдЪрдирд╛ рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛
  2. рд╡рд┐рдзрд┐ streamStatus рдХреЛ рдХрднреА рдирд╣реАрдВ NSStreamStatusError

рдЭрдВрдбрд╛ рдЙрдард╛рдП рдЬрд╛рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдореЗрдВ NSStreamDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ (рдКрдкрд░ рдЪреЗрдХрд╕рдо рдЧрдгрдирд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред

рдПрдХ рдФрд░ рдЕрдкреНрд░рд┐рдп рдЦреЛрдЬ рдпрд╣ рдереА рдХрд┐ рд╕реАрдПрдлрдПрди рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдЕрдкрдиреЗ рдкреЛрд▓-рдЗрдВрдЧ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реВрдк рдореЗрдВ open рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдереНрд░реЗрдб рдЗрд╕ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдЦреБрд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рднреНрд░рд╖реНрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдврд╛рдВрдЪреЗ рдХреА рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ POSBlobInputStream рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реНрдб рдСрдкрд░реЗрд╢рди рдореЛрдб рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рдХрд╛рд░рдг рдереА, рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рдеред

рдСрдлрд╝рд╕реЗрдЯ рд╕рдорд░реНрдерди рдкрдврд╝реЗрдВ


Clouds Mail.Ru iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрдкрдХреЛ рдЙрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдЯреНрд░реИрдлрд╝рд┐рдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдордп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рд╣реИред рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, POSBlobInputStream рдХреЛ рдлреЛрдЯреЛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢реБрд░реВ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдСрдлрд╕реЗрдЯ NSStreamFileCurrentOffsetKey рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдпрд╣ рдорд╛рдирдХ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди


POSBlobInputStream рдХреЛ рдЧреИрд▓рд░реА рд╕реЗ рдлрд╝реЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ POSBlobInputStreamDataSource рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 @protocol POSBlobInputStreamDataSource <NSObject> // // Self-explanatory KVO-compliant properties. @property (nonatomic, readonly, getter = isOpenCompleted) BOOL openCompleted; @property (nonatomic, readonly) BOOL hasBytesAvailable; @property (nonatomic, readonly, getter = isAtEnd) BOOL atEnd; @property (nonatomic, readonly) NSError *error; // // This selector will be called before anything else. - (void)open; // // Data Source configuring. - (id)propertyForKey:(NSString *)key; - (BOOL)setProperty:(id)property forKey:(NSString *)key; // // Data Source data. // The contracts of these selectors are the same as for NSInputStream. - (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)maxLength; - (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)bufferLength; @end 

рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡реАрдУ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзрд╛рд░рд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рд╕реНрдЯреНрд░реАрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдПрдирд╛рд▓реЙрдЧ рдХреА рдЦреЛрдЬ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЕрдЧрд░ рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХрд╛ рд╕рдВрдХрдЯ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, HSCountingInputStream рдореЗрдВ , рдорд╛рдирдХ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЧрд▓рдд рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрдХреНрд╕рд░ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NTVStreamMux рдореЗрдВ :

 #pragma mark Undocumented but necessary NSStream Overrides (fuck you Apple) - (void) _scheduleInCFRunLoop:(NSRunLoop*) inRunLoop forMode:(id)inMode { /* FUCK YOU APPLE */ } - (void) _setCFClientFlags:(CFOptionFlags)inFlags callback:(CFReadStreamClientCallBack)inCallback context:(CFStreamClientContext)inContext { /* NO SERIOUSLY, FUCK YOU */ } 

POSBlobInputStream , рдмрджрд▓реЗ рдореЗрдВ, Mail.Ru рдХреНрд▓рд╛рдЙрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рдореБрдЦ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕реЗрд╡рд╛ рдХреЗ рджреМрд░рд╛рди, рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реЗрдирд╛ рджреНрд╡рд╛рд░рд╛ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реЗрдХ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдФрд░ рд╕рдорддрд▓ рдХрд┐рдП рдЧрдП, рдФрд░ рдЗрд╕ рд╕рдордп рдкреНрд░рд╡рд╛рд╣ рд╕рдмрд╕реЗ рд╕реНрдерд┐рд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦреЗрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЦреБрд╢реА рд╣реЛрдЧреАред

рдкрд╛рд╡реЗрд▓ рдУрд╕рд┐рдкреЛрд╡,
рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рдЯреАрдо рд▓реАрдбрд░

Source: https://habr.com/ru/post/In216247/


All Articles