diff --git a/Project/Project/ASAAppDelegate.m b/Project/Project/ASAAppDelegate.m index bba83e8..20c221f 100644 --- a/Project/Project/ASAAppDelegate.m +++ b/Project/Project/ASAAppDelegate.m @@ -29,10 +29,16 @@ - (BOOL) application:(UIApplication *)application bounds]]; self.webView.hidden = NO; - [[VKConnector sharedInstance] startWithAppID:kVKAppID - permissons:[kVKPermissionsArray componentsSeparatedByString:@","] - webView:self.webView - delegate:self]; +// [[VKConnector sharedInstance] startWithAppID:kVKAppID +// permissons:[kVKPermissionsArray componentsSeparatedByString:@","] +// webView:self.webView +// delegate:self]; + _rm = [[VKRequestManager alloc] initWithDelegate:self]; + _rm.startAllRequestsImmediately = NO; + + VKRequest *r = [_rm info:@{@"user_ids": @"christian.burns"}]; + r.cacheLiveTime = VKCacheLiveTimeOneDay; + [r start]; // Override point for customization after application launch. self.viewController = [[ASAViewController alloc] @@ -52,9 +58,12 @@ - (void) connector:(VKConnector *)connector NSLog(@"Access token: %@", accessToken); - _rm = [[VKRequestManager alloc] initWithDelegate:self]; - [_rm info:@{@"user_ids": @"christian.burns"}]; - +// _rm = [[VKRequestManager alloc] initWithDelegate:self]; +// _rm.startAllRequestsImmediately = NO; +// +// VKRequest *r = [_rm info:@{@"user_ids": @"christian.burns"}]; +// r.cacheLiveTime = VKCacheLiveTimeOneDay; +// [r start]; } - (void)request:(VKRequest *)request responseError:(NSError *)error diff --git a/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequest/VKRequest.m b/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequest/VKRequest.m index ee7ae79..44fde14 100644 --- a/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequest/VKRequest.m +++ b/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequest/VKRequest.m @@ -195,30 +195,29 @@ - (void)start return; // перед тем как начать выполнение запроса проверим кэш - if (self.requestManager.user) { - NSUInteger currentUserID = self.requestManager.user.accessToken.userID; - VKStorageItem *item = [[VKStorage sharedStorage] - storageItemForUserID:currentUserID]; + NSUInteger currentUserID = self.requestManager.user.accessToken.userID; + VKStorageItem *item = [[VKStorage sharedStorage] + storageItemForUserID:currentUserID]; + + NSData *cachedResponseData = [item.cache cacheForURL:[self uniqueRequestURL] + offlineMode:self.offlineMode]; + if (nil != cachedResponseData) { + _receivedData = [cachedResponseData mutableCopy]; - NSData *cachedResponseData = [item.cache cacheForURL:[self uniqueRequestURL] - offlineMode:self.offlineMode]; - if (nil != cachedResponseData) { - _receivedData = [cachedResponseData mutableCopy]; - - // данные взяты из кэша - _isDataFromCache = YES; - - [self connectionDidFinishLoading:_connection]; - - // нет надобности следить за состоянием "обновляющего" запроса - // только при удачном исходе данные в кэше будут обновлены - self.delegate = nil; - } + // данные взяты из кэша + _isDataFromCache = YES; - // добавляем актуальный пользовательский токен доступа - self.HTTPQueryParameters[@"access_token"] = item.accessToken.token; + [self connectionDidFinishLoading:_connection]; + + // нет надобности следить за состоянием "обновляющего" запроса + // только при удачном исходе данные в кэше будут обновлены + self.delegate = nil; } + // добавляем актуальный пользовательский токен доступа + if (!item.accessToken.token.isEmpty) + self.HTTPQueryParameters[@"access_token"] = item.accessToken.token; + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; // HTTP метод отправки запроса diff --git a/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequestManager.m b/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequestManager.m index c4224cc..ec520a2 100644 --- a/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequestManager.m +++ b/Project/Vkontakte-iOS-SDK-LV/VKRequestManager/VKRequestManager.m @@ -30,6 +30,9 @@ @implementation VKRequestManager +{ + VKUser *_user; +} #pragma mark - Init @@ -53,6 +56,16 @@ - (instancetype)initWithDelegate:(id )delegate user:nil]; } +#pragma mark - Getters & Setters + +- (VKUser *)user { + return _user ? _user : [VKUser ghostUser]; +} + +- (void)setUser:(VKUser *)user { + _user = user; +} + #pragma mark - Users - (VKRequest *)info diff --git a/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.h b/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.h index 4519c35..cdcc234 100644 --- a/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.h +++ b/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.h @@ -66,6 +66,14 @@ Second example: */ + (instancetype)currentUser; +/** Non-authorized user, guest. + + This "ghost user" is used to help caching metchanism to work with non-authorized + requests (requests that don't have access_token) + +*/ ++ (instancetype)ghostUser; + /** Activates user with passed unique user identifier If there is no such user then NO will be returned, otherwise - YES. diff --git a/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.m b/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.m index c52743c..d83bf68 100644 --- a/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.m +++ b/Project/Vkontakte-iOS-SDK-LV/VKUser/VKUser.m @@ -2,26 +2,26 @@ // Created by AndrewShmig on 6/28/13. // // Copyright (c) 2013 Andrew Shmig -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following +// Software is furnished to do so, subject to the following // conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #import "VKUser.h" @@ -29,9 +29,12 @@ #import "VKConnector.h" +#define kGhostUserID 0 + + @implementation VKUser { - VKStorageItem *_storageItem; + VKStorageItem *_storageItem; } #pragma mark Visible VKUser methods @@ -39,121 +42,147 @@ @implementation VKUser - (instancetype)initWithStorageItem:(VKStorageItem *)storageItem { - VK_LOG(@"%@", @{ - @"storageItem" : storageItem - }); - - self = [super init]; - - if (self) { - _storageItem = storageItem; - } - - return self; + VK_LOG(@"%@", @{ + @"storageItem" : storageItem + }); + + self = [super init]; + + if (self) { + _storageItem = storageItem; + } + + return self; } #pragma mark - Class methods static VKUser *_currentUser; - + (instancetype)currentUser { - VK_LOG(); - -// пользователь установлен, но в хранилище его записи нет (возможно была удалена), а этого нельзя так оставлять - сбрасываем - VKStorageItem *item = [[VKStorage sharedStorage] - storageItemForUserID:_currentUser.accessToken.userID]; - - if (nil == item) { -// пользователь еще не был запрошен и не был установлен активным, либо -// пользователь был удалён - if (![[VKStorage sharedStorage] isEmpty]) { - -// хранилище содержит некоторые данные -// устанавливаем произвольного пользователя активным - VKStorageItem *storageItem = [[[VKStorage sharedStorage] - storageItems] lastObject]; - _currentUser = [[VKUser alloc] initWithStorageItem:storageItem]; - - } - } else { -// обновление токена доступа текущего пользователя для случаев, когда до -// этого имело место повторная авторизация пользователем приложения ВК - _currentUser.accessToken = item.accessToken; + VK_LOG(); + + // пользователь установлен, но в хранилище его записи нет (возможно была удалена), а этого нельзя так оставлять - сбрасываем + VKStorageItem *item = [[VKStorage sharedStorage] + storageItemForUserID:_currentUser.accessToken.userID]; + + if (nil == item) { + // пользователь еще не был запрошен и не был установлен активным, либо + // пользователь был удалён + if (![[VKStorage sharedStorage] isEmpty]) { + + // хранилище содержит некоторые данные + // устанавливаем произвольного пользователя активным + VKStorageItem *storageItem = [[[VKStorage sharedStorage] + storageItems] lastObject]; + _currentUser = [[VKUser alloc] initWithStorageItem:storageItem]; + } + } else { + // обновление токена доступа текущего пользователя для случаев, когда до + // этого имело место повторная авторизация пользователем приложения ВК + _currentUser.accessToken = item.accessToken; + } + + return _currentUser; +} - return _currentUser; +static VKUser *_ghostUser; ++ (instancetype)ghostUser { + VK_LOG(); + + if (nil != _ghostUser) { + return _ghostUser; + } + + // проверим, если призрачный пользователь был ранее создан + VKStorageItem *item = [[VKStorage sharedStorage] storageItemForUser:_ghostUser]; + + if (nil == item) { + // пользователь не создан - создаем + VKAccessToken *ghostUserAccessToken = [[VKAccessToken alloc] initWithUserID:kGhostUserID + accessToken:@""]; + + // сохраняем токен доступа в хранилище + VKStorageItem *storageItem = [[VKStorage sharedStorage] + createStorageItemForAccessToken:ghostUserAccessToken]; + [[VKStorage sharedStorage] storeItem:storageItem]; + + _ghostUser = [[VKUser alloc] initWithStorageItem:storageItem]; + } + + return _ghostUser; } + (BOOL)activateUserWithID:(NSUInteger)userID { - VK_LOG(@"%@", @{ - @"userID" : @(userID) - }); - - VKStorageItem *storageItem = [[VKStorage sharedStorage] - storageItemForUserID:userID]; - - if (nil == storageItem) - return NO; - - _currentUser = [[VKUser alloc] initWithStorageItem:storageItem]; - - return YES; + VK_LOG(@"%@", @{ + @"userID" : @(userID) + }); + + VKStorageItem *storageItem = [[VKStorage sharedStorage] + storageItemForUserID:userID]; + + if (nil == storageItem) + return NO; + + _currentUser = [[VKUser alloc] initWithStorageItem:storageItem]; + + return YES; } - (void)logout { - VK_LOG(); - - if(nil == _currentUser) - return; - -// чистим куки - [[VKConnector sharedInstance] clearCookies]; - -// находим нужную запись и удаляем из хранилища - VKStorageItem *item = [[VKStorage sharedStorage] - storageItemForUserID:_currentUser.accessToken.userID]; - [[VKStorage sharedStorage] removeItem:item]; - -// обнуляем текущего пользователя - _currentUser = nil; + VK_LOG(); + + if(nil == _currentUser) + return; + + // чистим куки + [[VKConnector sharedInstance] clearCookies]; + + // находим нужную запись и удаляем из хранилища + VKStorageItem *item = [[VKStorage sharedStorage] + storageItemForUserID:_currentUser.accessToken.userID]; + [[VKStorage sharedStorage] removeItem:item]; + + // обнуляем текущего пользователя + _currentUser = nil; } + (NSArray *)localUsers { - VK_LOG(); - - NSMutableArray *localUsers = [[NSMutableArray alloc] init]; - - [[[VKStorage sharedStorage] storageItems] - enumerateObjectsUsingBlock:^(id obj, - NSUInteger idx, - BOOL *stop) - { - [localUsers addObject:@(((VKStorageItem *) obj).accessToken.userID)]; - }]; - - return localUsers; + VK_LOG(); + + NSMutableArray *localUsers = [[NSMutableArray alloc] init]; + + [[[VKStorage sharedStorage] storageItems] + enumerateObjectsUsingBlock:^(id obj, + NSUInteger idx, + BOOL *stop) + { + [localUsers addObject:@(((VKStorageItem *) obj).accessToken.userID)]; + }]; + + return localUsers; } #pragma mark - Setters & Getters - (VKAccessToken *)accessToken { - VK_LOG(); - - return _storageItem.accessToken; + VK_LOG(); + + return _storageItem.accessToken; } #pragma mark - Overridden methods - (NSString *)description { - VK_LOG(); - - return [_storageItem.accessToken description]; + VK_LOG(); + + return [_storageItem.accessToken description]; } @end \ No newline at end of file diff --git a/Vkontakte-iOS-SDK-LV-Workspace.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate b/Vkontakte-iOS-SDK-LV-Workspace.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate index 1bdeb83..8d2d2ff 100644 Binary files a/Vkontakte-iOS-SDK-LV-Workspace.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate and b/Vkontakte-iOS-SDK-LV-Workspace.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate differ