通过http 方式向服务器发送消息,同时从服务器端得到json 串,但是现在遇到了问题,当我通过了登陆页面之后,再次向服务器端发起请求,结果服务器端显示我未登陆,不知道该用什么方法来保持于服务器端的登陆状态。
>> 第一次登录后 取得一个jsessionid 以后要是这个id 还有效 就带上它[" set-cookie" 这个字段就是你这个jsessionid值 ]
一段使用cookies的代码:
- (NSURLRequest *)HttpPost:(NSString *)url {
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookies];
NSHTTPCookie *Cookie = nil;
for(NSHTTPCookie *_cookie in cookies) {
if([[_cookie domain]isEqualToString:YOURDomain]) {
_iCookie = _cookie;
break;
}
}
NSMutableURLRequest *_request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[_request setHTTPMethod:@"POST"];
[_request setTimeoutInterval:10];
[_request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
[_request setHTTPShouldHandleCookies:YES];
[_request setValue:[NSString stringWithFormat:@"%@=%@", [_Cookie name], [_Cookie value]] forHTTPHeaderField:@"Cookie"];
return _request;
}
谨慎使用ASIHttpRequest的block特性
使用ASIHttpRequest的setCompletionBlock、setFailedBlock时碰到一些诡异的内存泄漏和莫名其妙的行为(如:无法release对象)。经过与同事的讨论、查找资料终于得以解决,全是对block理解不透彻惹的祸。
1. 声明ASIHttpRequest时一定要使用__block关键字
__block关键字告诉block不要retain request,这对于防止循环retain非常重要!!因为request总是会retain block
2. 谨慎处理block与对象的关系
当setCompletionBlock/setFailedBlock内部使用对象的instance var时,self会被retain(If you access an instance variable by reference, self is retained;)。所以在request结束前向对象发送release消息不会导致对象的释放(dealloc),亦即:该对象依然可进行所有操作,这将导致诸多你意想不到的结果。
3. 解决第2点的问题
3.1 仔细拿捏block与对象的关系 + 按值的方式访问instance var(If you access an instance variable by value, the variable is retained.)
3.2 不使用block,而使用ASIHttpRequestDelegate
4. 参考资料
4.1 http://allseeing-i.com/ASIHTTPRequest/How-to-use - Using blocks
4.2 Blocks Programming Topics - Object and Block Variables
原文:
http://www.cocoachina.com/bbs/read.php?tid=95100
SearchManager具体使用步骤如下:
(1)配置search bar的相关信息,新建一个位于res/xml下的一个searchable.xml的配置文件,如默认值、是否有搜索建议或者语音搜索。
manifest.xml配置,搜索结果处理的Activity将出现两种情况,一种是从其他Activity中的search bar打开一个Activtiy专门处理搜索结果,第二种是就在当前Activity就是处理结果的Activity,先介绍第一种配置:
搜索建议在manifest.xml中相关的配置
为了能够使用search bar 我们必须重写Activity的onSearchRequested的方法,在界面上启动一个search bar 但是这个动作不会自动触发,必须通过一个按钮或者菜单的点击事件触发;
接收query和bundle、保存query值(即搜索建议的列表值)
之前说到了处理结果的Activity将可能出现的两种情况的两种,现在就处理第二种状况,就是假如invoke search bar的Activity同时也是处理搜索结果的Activity,如果按照之前的方式处理则会出现一种情况,搜索一次就实例化一次Activity,当按返回键的时候会发现老是同一个Activity,其实为了使它只有一个实例化对象,只需简单的配置和代码就能实现 第一:在处理搜索结果Activity的manifest.xml中添加android:launchMode="singleTop"属性 第二:重写Activity的onNewIntent(Intent intent)
相关知识:上面讲到了将最近的搜索值添加到搜索建议中,但却没有提到如果清理搜索建议中的值,与保存相似,SearchRecentSuggestion对象提供了一个clearHistory()方法