我正在使用ASIHTTPRequest登录我的应用程序,并创建了一个bool方法来登录并且运行良好:
-(BOOL)User:(NSString *)user password:(NSString *)password
{
NSURL *url = [NSURL URLWithString:url];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseSessionPersistence:YES];
[request setUseKeychainPersistence:NO];
[request setUsername:user];
[request setPassword:password];
[request setDomain:domain];
[request startSynchronous];
NSError *loginError = [request error];
if(loginError == nil){
return true;
}else{
return false;
}
}
但现在我试图在这种方法之外使用这些信用卡。我阅读了文档,看来我可以通过以下方式使用这些信息:
//Should reuse our username and password
request = [ASIHTTPRequest requestWithURL:url];
但是这会引发错误,因为不会定义请求。我该怎么做?
答案 0 :(得分:1)
仅在方法中request
变量的有效范围。您还应该在方法外部定义新变量。
如下所示:
//Should reuse our username and password
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
答案 1 :(得分:0)
如果启用
useSessionPersistence
(默认情况下),则ASIHTTPRequest会将凭据存储在内存中,并可以将其重新用于后续请求。
这意味着您的凭据将存储在sessionCredentialsStore
(如果您正在使用代理,则sessionProxyCredentialsStore
)。除非您覆盖它们,否则它们将自动应用于所有后续请求。这两个变量都是static
个全局变量。
因此,只需正常发出请求,只要您不修改凭据存储,凭据就会应用于下一个请求。
答案 2 :(得分:0)
我不是很清楚你在问什么,但据我所知,你关注的是在请求被触发后提取用户凭据。这是对的吗?
我认为这样做的理想方法是永远不要放弃请求(或者只是使用Keychain
进行缓存)。因此,基本上将此request
变量保存为特定对象的实例变量(ivar)(可能是处理登录任务的单例管理器类型类)。实施例
// LoginManager.h
@import Foundation;
@interface LoginManager : NSObject
@property (nonatomic, readonly, strong) ASIHTTPRequest *request;
@end
// LoginManager.m
#import "LoginManager.h"
@interface LoginManager ()
@property (nonatomic, readwrite, strong) ASIHTTPRequest *request;
@end
@implementation LoginManager
+ (instancetype)sharedManager
{
static LoginManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
-(BOOL)User:(NSString *)user password:(NSString *)password
{
NSURL *url = [NSURL URLWithString:url];
self.request = [ASIHTTPRequest requestWithURL:url];
[self.request setUseSessionPersistence:YES];
[self.request setUseKeychainPersistence:NO];
[self.request setUsername:user];
[self.request setPassword:password];
[self.request setDomain:domain];
[self.request startSynchronous];
NSError *loginError = [request error];
if(loginError == nil)
{
return true;
}
else
{
return false;
}
}
@end
通过以下方式访问:
ASIHTTPRequest *request = [[LoginManager sharedManager] request]
NSLog(@"%@", request.username);
NSLog(@"%@", request.password);