рдХреНрдпреЛрдВ NSURLSession NSURLConnection рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ



iOS 7 рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рд┐рддрдВрдмрд░ рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрдм Apple рдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ - NSURLSessionред рдпрд╣ рдПрдХ рдХрд╛рдлреА рдореМрд▓рд┐рдХ рдмрд╛рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЖрдИрдУрдПрд╕ 6 рдФрд░ рдиреАрдЪреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдм рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, 75 рд╕реЗ 85 рдкреНрд░рддрд┐рд╢рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдирд╡реАрдирддрдо рдЖрдИрдУрдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдЧрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ NSURLSession рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред

Apple рдХреЗ рдЕрдиреБрд╕рд╛рд░, NSURLSession рдХреЛ NSURLConnection рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдкреНрд░рд╢реНрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдарддрд╛ рд╣реИ: "рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?" рдЗрд╕рд▓рд┐рдП, рддреБрд░рдВрдд NSURLConnection рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рд╛рдн:
  1. рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВ
  2. рдбрд╛рдЙрдирд▓реЛрдб рд░реЛрдХрдиреЗ рдФрд░ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  3. рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмреНрд▓реЙрдХ рдФрд░ рдбреЗрд▓рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  4. рд╕рддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрдВрдЯреЗрдирд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕рддреНрд░ рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ (рдЕрдиреБрд░реЛрдзреЛрдВ) рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рддреНрд░ рдореЗрдВ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░
  5. рдЖрдк рдХреБрдХреАрдЬрд╝, рдХреИрд╢ рдФрд░ рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рд╕рдВрдЧреНрд░рд╣рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  6. рд╣рдореЗрдВ рдЧрдиреНрджрд╛ NSURLConnection рдХреЗ рд╕реЗрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдзрд┐рдХ рдХрдареЛрд░ рдФрд░ рд╕рдВрд░рдЪрд┐рдд рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ



рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдирдпрд╛ рддрд░реАрдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдореБрдЦ рд╡рд░реНрдЧ рд╣реИ NSURLSession, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╣ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб / рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рддреНрд░ рдмрдирд╛рддрд╛ рд╣реИред рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рддреНрд░ рд╣реИрдВ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ NSURLConnection рдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛, рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ - рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд░реИрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдирд┐рдЬреА рдореЛрдб рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ), рдбрд╛рдЙрдирд▓реЛрдб - рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

NSURLSessionConfiguration


рд╕рддреНрд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ NSURLSessionConfiguration рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рддреНрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЪреБрдирдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ: рдореЛрдмрд╛рдЗрд▓ рдиреЗрдЯрд╡рд░реНрдХ, рдХреБрдХреАрдЬрд╝, рдХреИрд╢, рдкреНрд░реЙрдХреНрд╕реА рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡реЗрдХрд╛рдзреАрди рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рд╡реЗрдХ (рдЬрдм рд╡рд╛рдИ-рдлрд╛рдИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреИрдЯрд░реА рд╢рдХреНрддрд┐ рд╣реИ) рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

NSURLSession


рд╕рддреНрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рддреНрд░ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдПрдБ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдПред рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ (рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж) рдореЗрдВ рдкрдХрдбрд╝рддреЗ рд╣реИрдВред

NSURLTask


рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ NSURLConnection рдерд╛ред рд╡рд░реНрдЧ рд╣реА рд╕рд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ 3 рдЙрдкрд╡рд░реНрдЧ рд╣реИрдВ: NSURLSessionDataTask, NSURLSessionUploadTask (рдкрд╣рд▓реЗ рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ) рдФрд░ NSURLSessionDownloadTask, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрди рд╕рднреА рдХреЛ рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдПрдХ рдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рддреНрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд╕рдм рдХреБрдЫ рд╡рд┐рджреЗрд╢реА рд▓рдЧрддрд╛ рд╣реИ:
NSURLSessionDownloadTask *downloadTask = [ourSession downloadTaskWithRequest:simpleNSURLRequest]; 


рдмреНрд▓реЙрдХ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ NSURLConnection рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд▓реНрджреА рд╕реЗ рд╕рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
рд╕реГрдЬрди рдХреЗ рд╕рдордп рд╕рддреНрд░реЛрдВ рдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред
 [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ (рдХрд╛рд░реНрдпреЛрдВ рд╕рд╣рд┐рдд) рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
  -(NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler 

рдлрд┐рд░ рд╕реЗ, рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рд╣рдореЗрдВ NSURLConnection -sendAsynchronousRequest рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ: рдХрддрд╛рд░: рдкреВрд░реНрдгрд╣реИрдВрдбрд▓рд░:
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг


рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ, рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп!

рд░реЛрдХрдирд╛ / рд▓реЛрдб рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдкреВрд░реА рдпреЛрдЬрдирд╛ NSURLConnection рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди, рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рдмрд╕ рдХрд┐рд╕реА рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛рд░реНрдп рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рджреНрдж рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ URLSession: рдХрд╛рд░реНрдп: didCompleteWithError: рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рд╡рд╣рд╛рдВ рдЖрдк UI рдХреЗ рд╕рд╛рде рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░ рд╕рдХреЗрдВред рдФрд░ рдЖрдк рди рдХреЗрд╡рд▓ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдмрд╕ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
  [self.resumableTask cancelByProducingResumeData:^(NSData *resumeData) { partialDownload = resumeData; self.resumableTask = nil; }]; //        if(partialDownload) { self.resumableTask = [inProcessSession downloadTaskWithResumeData:partialDownload]; } else { ... } [self.resumableTask resume]; 

рдХрд╛рд░реНрдп рдХреЛ рд░реЛрдХрдХрд░, рдЖрдк рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдирдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛рд░реНрдп рдХреЛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд╛рдЗрд▓ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

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

рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
 NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; NSURL* downloadTaskURL = [NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/commons/1/14/Proton_Zvezda_crop.jpg"]; [[session downloadTaskWithURL: downloadTaskURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; NSURL *documentsDirectory = [urls objectAtIndex:0]; NSURL *originalUrl = [NSURL URLWithString:[downloadTaskURL lastPathComponent]]; NSURL *destinationUrl = [documentsDirectory URLByAppendingPathComponent:[originalUrl lastPathComponent]]; NSError *fileManagerError; [fileManager removeItemAtURL:destinationUrl error:NULL]; // ! [fileManager copyItemAtURL:location toURL:destinationUrl error:&fileManagerError]; }] resume]; 


рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
 NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; NSURL* downloadTaskURL = [NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/commons/1/14/Proton_Zvezda_crop.jpg"]; [[session downloadTaskWithURL:downloadTaskURL] resume]; //    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { //  } 


рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдореЗрдВ рд╕реНрдерд╛рди рдЪрд░ рдореЗрдВ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
рдлрд╝рд╛рдЗрд▓: /// рдирд┐рдЬреА / var / mobile / Applications / {appUUID} /tmp/CFNetworkDownload_fileID.tmp, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ: /// var / рдореЛрдмрд╛рдЗрд▓ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / {appUUID} / рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ /Proton_Zvezda_crop.jpg

рдПрдХ рд╕рдордп рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рднреЗрдЬреЗрдВ

рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдПрдХ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - 5. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 sessionConfig.HTTPMaximumConnectionsPerHost = 5; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдПрдЧреА, рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдореИрдВ 3 рдЬреА (рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рдбреЗрд╡рд▓рдкрд░ -> рдиреЗрдЯрд╡рд░реНрдХ рд▓рд┐рдВрдХ рдХрдВрдбреАрд╢рдирд░ -> рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЪреБрдиреЗрдВ -> 3 рдЬреА -> рд╕рдХреНрд╖рдо) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

 - (void) methodForNSURLSession{ NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; _tasksArray = [[NSMutableArray alloc] init]; sessionConfig.HTTPMaximumConnectionsPerHost = 5; sessionConfig.timeoutIntervalForResource = 0; sessionConfig.timeoutIntervalForRequest = 0; NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; // download tasks // [self createDataTasksWithSession:session]; // data tasks [self createDownloadTasksWithSession:session]; } - (void) createDownloadTasksWithSession:(NSURLSession *)session{ for (int i = 0; i < 10; i++) { NSURLSessionDownloadTask *sessionDownloadTask = [session downloadTaskWithURL: [NSURL URLWithString:@"https://discussions.apple.com/servlet/JiveServlet/showImage/2-20930244-204399/iPhone%2B5%2BProblem2.jpg"]]; [_tasksArray addObject:sessionDownloadTask]; [sessionDownloadTask addObserver:self forKeyPath:@"countOfBytesReceived" options:NSKeyValueObservingOptionOld context:nil]; [sessionDownloadTask resume]; } } - (void) createDataTasksWithSession:(NSURLSession *)session{ for (int i = 0; i < 10; i++) { NSURLSessionDataTask *sessionDataTask = [session dataTaskWithURL: [NSURL URLWithString:@"https://discussions.apple.com/servlet/JiveServlet/showImage/2-20930244-204399/iPhone%2B5%2BProblem2.jpg"]]; [_tasksArray addObject:sessionDataTask]; [sessionDataTask addObserver:self forKeyPath:@"countOfBytesReceived" options:NSKeyValueObservingOptionOld context:nil]; [sessionDataTask resume]; } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if([[change objectForKey:@"old"] integerValue] == 0){ NSLog(@"task %d: started", [_tasksArray indexOfObject: object]); } } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ NSLog(@"task %d: finished!", [_tasksArray indexOfObject:task]); } 


рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛:
 sessionConfig.timeoutIntervalForResource = 0; sessionConfig.timeoutIntervalForRequest = 0; 

рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░:
timeoutIntervalForRequest - рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп
timeoutIntervalForResource - рд╡рд╣ рд╕рдордп рдЬреЛ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдФрд░ рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рд╣рдо рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ([рдХрд╛рд░реНрдп рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛)) рдЯрд╛рдЗрдордЖрдЙрдЯIntervalForRequest рдХрд╛рдЙрдВрдЯрд░ рдЯрд┐рдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 100 рдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ 5 рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдорд╛рди рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдХрд╣реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдереЛрдбрд╝рд╛ рд╕рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдЪрд░ рдХреЛ рд╕рдорд╛рди рдорд╛рдиреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ 0 рдкрд░ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдЕрдирдВрдд рддрдХ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рдВ, рдмреЗрд╢рдХ рдЖрдк рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╡рд┐рдХрд▓реНрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, Apple рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдирд╣реАрдВ рдерд╛ред

рдЯреНрд░реИрдХрд┐рдВрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдЯрд╛рд╕реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рд╣реИ:
 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { double progress = (double)totalBytesWritten / (double)totalBytesExpectedToWrite; NSLog(@"download: %@ progress: %f", downloadTask, progress); dispatch_async(dispatch_get_main_queue(), ^{ self.progressView.progress = progress; }); } 

рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡реАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг wwdc'13 705 рд╕реЗ рдбреЗрдореЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдбреЗрдореЛ рдиреЗ рдореБрдЭреЗ рдЭрдЯрдХрд╛ рджрд┐рдпрд╛ред рд╣рдо рдЪрд┐рддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рд▓реМрдЯрддреЗ рд╣реИрдВ - рдЪрд┐рддреНрд░ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХ рдореЗрдиреВ (рд╣реЛрдо рдмрдЯрди рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ) рдореЗрдВ рднреА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдпрджрд┐ рд╣рдо рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛! рд╣рд╛рдВ, рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ UI рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕рд╣реА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдореЗрдиреВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯред рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдЬрдм рдбрд╛рдЙрдирд▓реЛрдб рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдорд╛рд╕реНрдЯрд░ рд╣реА рдорд╛рд╕реНрдЯрд░ рд╣реИред

рдРрд╕рд╛ "рдЬрд╛рджреВ" рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдбреЗрдореЙрди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рд░рд╣реЗрдЧрд╛ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдЖрд╡реЗрджрди рдХреЛ рд░реЛрдХрдиреЗ рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВред рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдореЙрди "рдЙрдарддрд╛ рд╣реИ" рдЖрд╡реЗрджрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рддреНрд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛рдирд╛ рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рддреНрд░ рд╕реЗ "рдХрдиреЗрдХреНрдЯ" рдХрд░реЗрдЧрд╛ред

рдЕрдм рд╣рдо рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╣реА рдпрд╣рд╛рдВ рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХрд▓ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╕рддреНрд░ рдмрдирд╛рдПрдВ:
 - (NSURLSession *)backgroundSession{ static NSURLSession *session = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //         ,      NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.dev.BackgroundDownloadTest.BackgroundSession"]; [config setAllowsCellularAccess:YES]; session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; }); return session; } 

рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдардирд╛ рдЪрд╛рд╣рд┐рдП):
  self.downloadTask = [[self backgroundSession] downloadTaskWithURL:[NSURL URLWithString:@"https://discussions.apple.com/servlet/JiveServlet/showImage/2-20930244-204399/iPhone%2B5%2BProblem2.jpg"]]; [self.downloadTask resume]; 

рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ, рдЫрд╡рд┐ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ рджрд┐рдЦрд╛рдПрдВ:
 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { // save image //   //... // set image if (success) { dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = [UIImage imageWithContentsOfFile:[destinationPath path]]; [self.progressView setHidden:YES]; }); } } 


рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрдд рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдЕрдВрдд рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдФрд░ рдкрд┐рдЫрд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)
 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (error) { NSLog(@"error: %@ - %@", task, error); } else { NSLog(@"success: %@", task); } self.downloadTask = nil; //  ,     [self callCompletionHandlerIfFinished]; } 


рдЕрдм рдЪрд▓рд┐рдП AppDelegate.m рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ
рдбрд╛рдЙрдирд▓реЛрдб рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
 - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler { //    ,    UILocalNotification* locNot = [[UILocalNotification alloc] init]; locNot.fireDate = [NSDate dateWithTimeIntervalSinceNow:1]; locNot.alertBody = [NSString stringWithFormat:@"still alive!"]; locNot.timeZone = [NSTimeZone defaultTimeZone]; [[UIApplication sharedApplication] scheduleLocalNotification:locNot]; //     -   ,     , //   UI        . //      self.backgroundSessionCompletionHandler = completionHandler; } 


рд╣рдо рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рд╕рддреНрд░ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░реЗрдВрдЧреЗ:
 - (void)viewDidLoad { [super viewDidLoad]; [self backgroundSession]; } 


рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 - (void)callCompletionHandlerIfFinished { NSLog(@"call completion handler"); [[self backgroundSession] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { NSUInteger count = [dataTasks count] + [uploadTasks count] + [downloadTasks count]; if (count == 0) { //    //       //      UI NSLog(@"all tasks ended"); AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; if (appDelegate.backgroundSessionCompletionHandler == nil) return; void (^comletionHandler)() = appDelegate.backgroundSessionCompletionHandler; appDelegate.backgroundSessionCompletionHandler = nil; comletionHandler(); } }]; } 


рдореИрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:
 Warning: Application delegate received call to - application:handleEventsForBackgroundURLSession:completionHandler: but the completion handler was never called. 


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

рдпрд╣ рд╕рдм, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЖрдЧрд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ NSURLSession рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛!

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


All Articles