IOS рдХреЗ рд▓рд┐рдП рдХреЛрд░ рдбреЗрдЯрд╛ред рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 1ред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛

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



рд╕рд╛рдордЧреНрд░реА:




рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛


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


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рд╣рдо Vkontakte iOS SDK v2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╡реИрд╕реЗ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдореЗрдВ рди рдХреЗрд╡рд▓ рдПрдХреНрд╕рдХреЛрдб, рдмрд▓реНрдХрд┐ рдРрдкрдХреЛрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЬреЗрдмреА рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!)ред AppCode рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╡рд╣рд╛рдБ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдЗрдП рдЬрд╛рдиреЗ ...

рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ

рдХреЛрд░ рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ - рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдПрдкреНрд▓реАрдХреЗрд╢рдиред
рдЫрд╡рд┐
рдЫрд╡рд┐

рдЖрд╡реЗрджрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╢реБрд░реВ рд╣реБрдЖ:
рдЫрд╡рд┐

UITableView рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛

ASAViewController.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
@property (nonatomic, strong) UITableView *tableView; 

ASAViewController.h рдХрд╛ рдкреВрд░рд╛ рджреГрд╢реНрдп:
 #import <UIKit/UIKit.h> @interface ASAViewController : UIViewController @property (nonatomic, strong) UITableView *tableView; @end 

ASAViewController.m рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ UITableView рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ
  CGRect frame = [[UIScreen mainScreen] bounds]; _tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; [self.view addSubview:_tableView]; 

ASAViewController.m рдХрд╛ рдкреВрд░рд╛ рджреГрд╢реНрдп:
 #import "ASAViewController.h" @implementation ASAViewController - (void)viewDidLoad { CGRect frame = [[UIScreen mainScreen] bounds]; _tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; [_tableView setDelegate:self]; [_tableView setDataSource:self]; [self.view addSubview:_tableView]; } @end 


рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
рдЫрд╡рд┐

рдпрд╣ UITableViewDelegate рдФрд░ UITableViewDataSource рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рд╣рдо ASAViewController.h рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 @interface ASAViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 

рд╣рдо ASAViewController.m рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ рд╕реВрдЪреА рдореЗрдВ рджреЛрд╕реНрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рднрд░рд╛ рд╣реБрдЖ рд╕реЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП):
 #pragma mark - UITableViewDelegate & UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_userFriends count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"friendID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if(nil == cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; } // setting default image while main photo is loading cell.imageView.image = [UIImage imageNamed:@"default.png"]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSString* imgPath = _userFriends[(NSUInteger)indexPath.row][@"photo"]; NSData* img = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgPath]]; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [UIImage imageWithData:img]; }); }); NSString* firstName = _userFriends[(NSUInteger)indexPath.row][@"first_name"]; NSString* lastName = _userFriends[(NSUInteger)indexPath.row][@"last_name"]; NSString* fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; cell.textLabel.text = fullName; NSString* status = _userFriends[(NSUInteger)indexPath.row][@"status"]; cell.detailTextLabel.text = status; return cell; } 


_UserFriends рд╡реИрд░рд┐рдПрдмрд▓ ASAViewController рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ:
 @property (nonatomic, strong) NSMutableArray *userFriends; 


ASAViewController.h рдФрд░ ASAViewController.m рдХрд╛ рдЕрдВрддрд┐рдо рджреГрд╢реНрдп:
 #import <UIKit/UIKit.h> @interface ASAViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) NSMutableArray *userFriends; @end 

 #import "ASAViewController.h" @implementation ASAViewController - (void)viewDidLoad { _userFriends = [[NSMutableArray alloc] init]; CGRect frame = [[UIScreen mainScreen] bounds]; _tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; [_tableView setDelegate:self]; [_tableView setDataSource:self]; [self.view addSubview:_tableView]; } #pragma mark - UITableViewDelegate & UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_userFriends count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"friendID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if(nil == cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; } // setting default image while main photo is loading cell.imageView.image = [UIImage imageNamed:@"default.png"]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSString* imgPath = _userFriends[(NSUInteger)indexPath.row][@"photo"]; NSData* img = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgPath]]; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [UIImage imageWithData:img]; }); }); NSString* firstName = _userFriends[(NSUInteger)indexPath.row][@"first_name"]; NSString* lastName = _userFriends[(NSUInteger)indexPath.row][@"last_name"]; NSString* fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; cell.textLabel.text = fullName; NSString* status = _userFriends[(NSUInteger)indexPath.row][@"status"]; cell.detailTextLabel.text = status; return cell; } @end 

рд╕рдм рдХреБрдЫ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред

рдПрдХреАрдХрд░рдг VKontakte iOS SDK v2.0

рд╣рдо рдЗрд╕ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рд▓реЗрддреЗ рд╣реИрдВред

рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдХреНрд╡рд╛рд░реНрдЯреНрдЬрдХреЛрд░.рдлреНрд░реЗрдорд╡рд░реНрдХ
рдЫрд╡рд┐

Vkontakte iOS SDK рдЬреЛрдбрд╝реЗрдВ
рдЫрд╡рд┐

ASAAppDelegate.h рдореЗрдВ рд╣рдо рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 @interface ASAAppDelegate : UIResponder <UIApplicationDelegate, VKConnectorDelegate, VKRequestDelegate> 


ASAAppDelegate.m рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions рд╡рд┐рдзрд┐ рдореЗрдВ рдЪрд┐рдкрдХрд╛рдПрдБ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions :
  [[VKConnector sharedInstance] setDelegate:self]; [[VKConnector sharedInstance] startWithAppID:@"3541027" permissons:@[@"friends"]]; 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХреЛрдб рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ VKontakte рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред
рдЫрд╡рд┐

ASAAppDelegate.m рдореЗрдВ, рд╣рдо рджреЛ рдФрд░ рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
 #pragma mark - VKConnectorDelegate - (void) VKConnector:(VKConnector *)connector accessTokenRenewalSucceeded:(VKAccessToken *)accessToken { // now we can make request [[VKUser currentUser] setDelegate:self]; [[VKUser currentUser] friendsGet:@{ @"uid" : @([VKUser currentUser].accessToken.userID), @"fields" : @"first_name,last_name,photo,status" }]; } #pragma mark - VKRequestDelegate - (void)VKRequest:(VKRequest *)request response:(id)response { ASAViewController *controller = (ASAViewController *)self.window.rootViewController; controller.userFriends = response[@"response"]; [controller.tableView reloadData]; } 

рдЗрд╕ рд╕реНрддрд░ рдкрд░ ASAAppDelegate.h рдФрд░ ASAAppDelegate.m рдХрд╛ рдЕрдВрддрд┐рдо рджреГрд╢реНрдп:
 #import <UIKit/UIKit.h> #import "VKConnector.h" #import "VKRequest.h" @class ASAViewController; @interface ASAAppDelegate : UIResponder <UIApplicationDelegate, VKConnectorDelegate, VKRequestDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) ASAViewController *viewController; @end 

 #import "ASAAppDelegate.h" #import "ASAViewController.h" #import "VKUser.h" #import "VKAccessToken.h" @implementation ASAAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.viewController = [[ASAViewController alloc] initWithNibName:@"ASAViewController" bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [[VKConnector sharedInstance] setDelegate:self]; [[VKConnector sharedInstance] startWithAppID:@"3541027" permissons:@[@"friends"]]; return YES; } #pragma mark - VKConnectorDelegate - (void) VKConnector:(VKConnector *)connector accessTokenRenewalSucceeded:(VKAccessToken *)accessToken { // now we can make request [[VKUser currentUser] setDelegate:self]; [[VKUser currentUser] friendsGet:@{ @"uid" : @([VKUser currentUser].accessToken.userID), @"fields" : @"first_name,last_name,photo,status" }]; } #pragma mark - VKRequestDelegate - (void)VKRequest:(VKRequest *)request response:(id)response { ASAViewController *controller = (ASAViewController *)self.window.rootViewController; controller.userFriends = response[@"response"]; [controller.tableView reloadData]; } @end 

рд╣рдо рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рджреЗрдЦрддреЗ рд╣реИрдВ (рдКрдкрд░ рджрд┐рдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрд╡реЗрд░реА рдХреИрд╢рд┐рдВрдЧ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
рдЫрд╡рд┐
рдЫрд╡рд┐

рдХреЛрд░ рдбреЗрдЯрд╛ рд╕реЗ рдорд┐рдард╛рдИ

рддреЛ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЖрдХрд░реНрд╖рдХ рдЖрдП! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЛрдИ рд╣реИ;) рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рдУ, рдбреНрд░рд╛рдпрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЪрд╛рдп рдкреАрдПрдВ, рдХреИрдВрдбреА рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдХреБрддрд░рдирд╛, рдЕрдкрдиреЗ рдкреИрд░реЛрдВ рдХреЛ рдлреИрд▓рд╛рдПрдВ, рдЕрдкрдиреЗ рдкреИрд░реЛрдВ рдХреЛ рдлреИрд▓рд╛рдПрдВред

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

рдЗрд╕ рддрдереНрдп рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рд╣рдо VKRequestDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 - (void)VKRequest:(VKRequest *)request connectionErrorOccured:(NSError *)error { // TODO } 

рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЕрд░реЗ рд╣рд╛рдБ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдпрд╛! рд╣рдо CoreData.framework рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЫрд╡рд┐
ASAAppDelegate.h рдореЗрдВ рд╣рдорд╛рд░реЗ рддреАрди рдкрд╕рдВрджреАрджрд╛ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ:
 @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong) NSPersistentStoreCoordinator *coordinator; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; 


рдЕрдм рддреАрдиреЛрдВ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ASAAppDelegate.m рдкрд░ рдЬрд╛рдПрдВред
рдкреНрд░рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓:
 - (NSManagedObjectModel *)managedObjectModel { if(nil != _managedObjectModel) return _managedObjectModel; _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return _managedObjectModel; } 

рд╕реНрдерд╛рдпреА рд╕реНрдЯреЛрд░ рд╕рдордиреНрд╡рдпрдХ:
 - (NSPersistentStoreCoordinator *)coordinator { if(nil != _coordinator) return _coordinator; NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"BasicApplication.sqlite"]; _coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; NSError *error = nil; if(![_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _coordinator; } 

рдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рд╕рдВрджрд░реНрдн:
 - (NSManagedObjectContext *)managedObjectContext { if(nil != _managedObjectContext) return _managedObjectContext; NSPersistentStoreCoordinator *storeCoordinator = self.coordinator; if(nil != storeCoordinator){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:storeCoordinator]; } return _managedObjectContext; } 


рдирд┐рд░реНрдорд╛рдг ... рдФрд░ ... рдФрд░ ... рд╕рдм рдареАрдХ рд╣реИред

рдЕрдм рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╡реИрд╕реЗ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдмреАрдорд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╢рд╛рдпрдж рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдмрд╣рд╛рджреБрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ!
рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╣реА Xcode рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреЛрд▓реЗрдВ, рдХрдВрдЯреНрд░реЛрд▓ + рдПрди рджрдмрд╛рдПрдВ рдФрд░ рдХреЛрд░ рдбреЗрдЯрд╛ рдЪреБрдиреЗрдВ -> рдбреЗрдЯрд╛ рдореЙрдбрд▓:
рдЫрд╡рд┐

рдореЙрдбрд▓ рдХреЛ рдорд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ:
рдЫрд╡рд┐

рд╣рдо рдПрдХ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд╕реНрдХреНрд░реАрди рджреЗрдЦрддреЗ рд╣реИрдВ:
рдЫрд╡рд┐

рдорд┐рддреНрд░ рдирд╛рдордХ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдВ рдФрд░ 4 рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ: last_name (рд╕реНрдЯреНрд░рд┐рдВрдЧ), first_name (рд╕реНрдЯреНрд░рд┐рдВрдЧ), рд╕реНрдерд┐рддрд┐ (рд╕реНрдЯреНрд░рд┐рдВрдЧ), рдлреЛрдЯреЛ (рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛)ред
рдЫрд╡рд┐

рдПрдВрдбрдХреЛрдб рдХреЛ рдмрдВрдж рдХрд░реЗрдВред

рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдЧрд▓реА рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
ASAAppDelegate.m рдЦреЛрд▓реЗрдВ, VKRequest рдкрд░ рдЬрд╛рдПрдВ: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВ:
 - (void)VKRequest:(VKRequest *)request response:(id)response { ASAViewController *controller = (ASAViewController *)self.window.rootViewController; controller.userFriends = response[@"response"]; [controller.tableView reloadData]; //    ,     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ for(NSDictionary *user in controller.userFriends){ NSManagedObject *friend = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" inManagedObjectContext:self.managedObjectContext]; [friend setValue:user[@"first_name"] forKey:@"first_name"]; [friend setValue:user[@"last_name"] forKey:@"last_name"]; [friend setValue:[NSData dataWithContentsOfURL:[NSURL URLWithString:user[@"photo"]]] forKey:@"photo"]; [friend setValue:user[@"status"] forKey:@"status"]; NSLog(@"friend: %@", friend); } if([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:nil]){ NSLog(@"Unresolved error!"); abort(); } }); } 

рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЖрдк рдЖрдВрдЦ рдХреЛ рдкреНрд░рд╕рдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдЫрд╡рд┐

рдХрд░, рдпрд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рдиреЗ рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб - (void)VKRequest:(VKRequest *)request connectionErrorOccured:(NSError *)error рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 - (void)VKRequest:(VKRequest *)request connectionErrorOccured:(NSError *)error { //         NSMutableArray *data = [[NSMutableArray alloc] init]; //      NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Friend"]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"last_name" ascending:YES]; [fetchRequest setSortDescriptors:@[sortDescriptor]]; //   NSArray *tmpData = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; //   for(NSManagedObject *object in tmpData){ //    ,         -  :) if([object valueForKey:@"status"] == nil) continue; NSDictionary *tmp = @{ @"last_name": [object valueForKey:@"first_name"], @"first_name": [object valueForKey:@"last_name"], @"photo": [object valueForKey:@"photo"], @"status": [object valueForKey:@"status"] }; [data addObject:tmp]; } //   ""    ASAViewController *controller = (ASAViewController *)self.window.rootViewController; controller.userFriends = data; [controller.tableView reloadData]; } 


рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рд╕рдорд╛рдпреЛрдЬрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
:
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"friendID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if(nil == cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; } // setting default image while main photo is loading cell.imageView.image = [UIImage imageNamed:@"default.png"]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSData *img; if([_userFriends[(NSUInteger) indexPath.row][@"photo"] isKindOfClass:[NSData class]]){ img = _userFriends[(NSUInteger) indexPath.row][@"photo"]; } else { NSString* imgPath = _userFriends[(NSUInteger)indexPath.row][@"photo"]; img = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgPath]]; } dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [UIImage imageWithData:img]; }); }); NSString* firstName = _userFriends[(NSUInteger)indexPath.row][@"first_name"]; NSString* lastName = _userFriends[(NSUInteger)indexPath.row][@"last_name"]; NSString* fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; cell.textLabel.text = fullName; NSString* status = _userFriends[(NSUInteger)indexPath.row][@"status"]; cell.detailTextLabel.text = status; return cell; } 


рд╣реБрд░реНрд░реЗ! рдЖрд╡реЗрджрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рд╕реЗ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
рдЫрд╡рд┐

рдЦреБрд╢реА рдХреЗ рдЖрдВрд╕реВ

рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИ)ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреАрда рдФрд░ рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рдердХ рдирд╣реАрдВ рд░рд╣реА рд╣реИрдВред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЛрд░ рдбреЗрдЯрд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕рдордп рд╕реЗ рдЦреБрд╢ рд╣реИрдВред
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдЧрд▓реА рдХрдбрд╝реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЯрд┐рдкреНрдкрдгреА

рдХреБрдЫ рднреА рд▓реЗрдЦрдХ рдХреЛ рдЦреБрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреА рддрд░рд╣, рднрд▓реЗ рд╣реА рд╡рд╣ рдЖрд▓реЛрдЪрдирд╛ рд╣реЛ;)

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles