Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 101

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

Π˜Ρ‚Π°ΠΊ, довольно Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ попытаСмся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ HTML-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ с домашнСй страницы Apple, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² строковом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π² ΠΎΠΊΠ½Π΅ консоли:


NSString *urlAsString = @"http://www.apple.com";

NSURL *url = [NSURL URLWithString: urlAsString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];


[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {


if ([data length] >0 &&

error == nil){

NSString *html = [[NSString alloc] initWithData: data

encoding: NSUTF8StringEncoding];

NSLog(@"HTML = %@", html);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


}];


Π”Π°, всС Ρ‚Π°ΠΊ просто. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ Π½Π° диск Π² Ρ…ΠΎΠ΄Π΅ соСдинСния, это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подходящих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса NSData, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΎΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°:


NSString *urlAsString = @"http://www.apple.com";

NSURL *url = [NSURL URLWithString: urlAsString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];


[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {


if ([data length] >0 &&

error == nil){


/* ΠŸΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΠ΅ΠΌ имя Ρ„Π°ΠΉΠ»Π° ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. */


NSURL *filePath =

[[self documentsFolderUrl]

URLByAppendingPathComponent:@"apple.html"];


[data writeToURL: filePath atomically: YES];


NSLog(@"Successfully saved the file to %@", filePath);


}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


}];


ВсС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто. Π’ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях iOS SDK соСдинСния ΠΏΠΎ URL происходили с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ дСлСгирования, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ модСль стала ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΈ Π²Π°ΠΌ Π½Π΅ придСтся Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ².

11.2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΏΡ€ΠΈ асинхронных соСдинСниях

НСобходимо Π·Π°Π΄Π°Ρ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚ оТидания β€” ΠΏΡ€ΠΎΡ‰Π΅ говоря, Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ β€” ΠΏΡ€ΠΈ асинхронном соСдинСнии.

РСшСниС

Π—Π°Π΄Π°ΠΉΡ‚Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² URL-запросС, посылаСмом классу NSURLConnection.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ инстанцировании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° NSURLRequest для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ URL-соСдинСния ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ класса requestWithURL: cachePolicy: timeoutInterval:, относящимся ΠΊ этому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² сСкундах Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ timeoutInterval.

НапримСр, Ссли Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 30 сСкунд Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° загрузится содСрТимоС Π³Π»Π°Π²Π½ΠΎΠΉ страницы Apple (с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ синхронного соСдинСния), создайтС ваш URL Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *urlAsString = @"http://www.apple.com";

NSURL *url = [NSURL URLWithString: urlAsString];


NSURLRequest *urlRequest =

[NSURLRequest

requestWithURL: url

cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData

timeoutInterval:30.0f];


NSOperationQueue *queue = [[NSOperationQueue alloc] init];


[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {


if ([data length] >0 &&

error == nil){

NSString *html = [[NSString alloc] initWithData: data

encoding: NSUTF8StringEncoding];

NSLog(@"HTML = %@", html);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


}];

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


Π§Ρ‚ΠΎ ΠΆΠ΅ здСсь происходит? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ срСда Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ содСрТимоС, располоТСнноС ΠΏΠΎ прСдоставлСнной ссылкС. Если это удаСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… 30 сСкунд ΠΈ соСдинСниС устанавливаСтся Π΄ΠΎ возникновСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ β€” Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС срСда Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния выдаст Π²Π°ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ (error) Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°.

11.3. Бинхронная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ NSURLConnection

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

НСобходимо синхронно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒΡΡ URL.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса sendSynchronousRequest: returningResponse: error:, относящийся ΠΊ классу NSURLConnection. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° NSData.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ класса sendSynchronousRequest: returningResponse: error:, относящимся ΠΊ классу NSURLConnection, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ синхронный запрос ΠΊ URL. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹Π΅ соСдинСния Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚ΠΈ соСдинСния Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΈ Ссли этот ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π³Π»Π°Π²Π½Ρ‹ΠΉ, Ρ‚ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ останСтся свободным. Если ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ глобальной ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² GCD, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ синхронноС соСдинСниС, Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нашС ΠΏΠ΅Ρ€Π²ΠΎΠ΅ синхронноС соСдинСниС ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ попытаСмся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ домашнюю страницу сайта Yahoo!:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSLog(@"We are here…");


NSString *urlAsString = @"http://www.yahoo.com";

NSURL *url = [NSURL URLWithString: urlAsString];


NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];


NSURLResponse *response = nil;

NSError *error = nil;


NSLog(@"Firing synchronous url connection…");

NSData *data = [NSURLConnection sendSynchronousRequest: urlRequest

returningResponse:&response

error:&error];


if ([data length] > 0 &&

error == nil){

NSLog(@"%lu bytes of data was returned.", (unsigned long)[data length]);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"No data was returned.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


NSLog(@"We are done.");


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];


self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΠΎΠΊΠ½ΠΎ консоли, Ρ‚ΠΎ Ρ‚Π°ΠΌ окаТСтся Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:


We are here…

Firing synchronous url connection…

2 52117 bytes of data was returned.

We are done.


Π˜Ρ‚Π°ΠΊ, Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ написал Π½Π° консоли строку We are here…, доТдался окончания соСдинСния (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это синхронноС соСдинСниС, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ), Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π²Π΅Π» Π² ΠΎΠΊΠ½Π΅ консоли тСкст We are done. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ экспСримСнт. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС синхронноС соСдинСниС Π² глобальной ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² GCD, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ обСспСчим ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSLog(@"We are here…");


NSString *urlAsString = @"http://www.yahoo.com";


NSLog(@"Firing synchronous url connection…");


dispatch_queue_t dispatchQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


dispatch_async(dispatchQueue, ^(void) {


NSURL *url = [NSURL URLWithString: urlAsString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];

NSURLResponse *response = nil;

NSError *error = nil;


NSData *data = [NSURLConnection sendSynchronousRequest: urlRequest

returningResponse:&response

error:&error];


if ([data length] > 0 &&

error == nil){

NSLog(@"%lu bytes of data was returned.", (unsigned long)[data length]);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"No data was returned.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}

});


NSLog(@"We are done.");


self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];