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

рд╕рд╛рдордЧреНрд░реА:
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 1ред рдЖрд░рдВрдн рдХрд░рдирд╛ ( рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ )
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 2ред рдорд╛рд╕реНрдЯрд░ рдХреЛрд░ рдбреЗрдЯрд╛
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 3ред рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг: SQLite рдФрд░ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 4ред рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рдирд╛
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ релред рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 6ред рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд░рдирд╛
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 7ред рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдЯреНрдпреВрдирд┐рдВрдЧ
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 8ред рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреНрд░рд╡рд╛рд╕рди
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 9ред NSFetchedResultsController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВ
- рдЕрдзреНрдпрд╛рдп рд╕рдВрдЦреНрдпрд╛ 10ред рдЙрдиреНрдирдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛
рдЪреВрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓рд╛ рдЕрдзреНрдпрд╛рдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд╛рдорд╛рдЬрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗрдВрдЧреЗ рдЬреЛ рд╡реАрдХреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рджреЛрд╕реНрддреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рд▓рдЧрднрдЧ (рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рдирд╛ / рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдирд╛ рд╣реИ) рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдХрдИ рдШрдВрдЯреЛрдВ (рдпрд╛ рд╢рд╛рдпрдж рдорд┐рдирдЯреЛрдВ) рдХреЗ рдмрд╛рдж рд╣рд╛рд░реНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рд╣рдо
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 {
рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдЕрд░реЗ рд╣рд╛рдБ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдпрд╛! рд╣рдо
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];
рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЖрдк рдЖрдВрдЦ рдХреЛ рдкреНрд░рд╕рдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдХрд░, рдпрд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рдиреЗ рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб
- (void)VKRequest:(VKRequest *)request connectionErrorOccured:(NSError *)error
рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
- (void)VKRequest:(VKRequest *)request connectionErrorOccured:(NSError *)error {
рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рд╕рдорд╛рдпреЛрдЬрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
- (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]; }
рд╣реБрд░реНрд░реЗ! рдЖрд╡реЗрджрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рд╕реЗ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

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