AFNETWorking3.x实战教程
上一篇文章介绍了优秀的第三方网络请求框架AFNETWorking2.0,本篇就通过一个实战例子来总结AFNetworking的使用。
本文参考http://www.raywenderlich.com/59255/afnetworking-2-0-tutorial#comments的例子。英文好的可以阅读看看,我觉得太啰嗦了。不利于抓住要点,本文就是它的提炼中文版。
一、准备工作
1.下载初始程序项目,地址:http://pan.baidu.com/s/1sj3SNeP。因为本文专注于使用AFNETWorking2.0请求网络数据,所以一些其他工作已经做好,您可以下载下来熟悉一下。
2.最终程序,地址:http://pan.baidu.com/s/1gdjo2hd。这是我在完成本教程后的最终程序效果。
3.查看本程序请求的服务器返回的数据格式:
JSON:http://www.raywenderlich.com/demos/weather_sample/weather.php?format=json
XML:http://www.raywenderlich.com/demos/weather_sample/weather.php?format=xml
PLIST:http://www.raywenderlich.com/demos/weather_sample/weather.php?format=plist (部分浏览器显示不正确)
二、实战
实战1.通过AFNetworkReachabilityManager 可以用来检测网络状态的变化
1.找到WTTableViewController.m文件,在viewDidLoad:方法下面添加一个新方法netWorkMonitor。
#pragma mark - 监控网络 - (void)netWorkMonitor { /*知识点1: 通过AFNetworkReachabilityManager 可以用来检测网络状态的变化 */ AFNetworkReachabilityManager *reachManager = [AFNetworkReachabilityManager sharedManager]; [reachManager startMonitoring]; [reachManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"网络状态" message:@"网络异常" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; break; } case AFNetworkReachabilityStatusNotReachable: { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"网络状态" message:@"网络未连接" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; break; } case AFNetworkReachabilityStatusReachableViaWWAN: { self.title = @"WWAN连接"; break; } case AFNetworkReachabilityStatusReachableViaWiFi: { self.title = @"WIFI连接"; break; } default: { break; } } }]; }
netWorkMonitor方法
2.在viewDidLoad:方法的self.navigationController.toolbarHidden = NO;下面一行调用此方法:
//检测网络状态 [self netWorkMonitor];
3.然后在真机上运行,然后切换WiFi、WWAN或者飞行模式看看效果把。
实战2:通过AFHTTPRequestOperation来请求JSON,XML和PLIST格式的服务器响应数据
1.找到WTTableViewController.m文件,使WTTableViewController类继承NSXMLParserDelegate代理,用于XML解析。代码如下:
@interface WTTableViewController ()<NSXMLParserDelegate,CLLocationManagerDelegate>
2.替换中WTTableViewController.m文件中的的jsonTapped:,plistTapped:,xmlTapped:方法,将他们替换成如下代码:
#pragma mark - AFHTTPRequestOperation相关 /*知识点2:AFHTTPRequestOperation 继承自 AFURLConnectionOperation,使用HTTP以及HTTPS协议来处理网络请求。它封装成了一个可以令人接受的代码形式。当然AFHTTPRequestOperationManager 目前是最好的用来处理网络请求的方式,但AFHTTPRequestOperation 也有它自己的用武之地。*/ //json数据 - (IBAction)jsonTapped:(id)sender { // 创建请求的URL,然后创建NSURLRequest NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString]; NSURL *url = [NSURL URLWithString:string]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 利用AFHTTPRequestOperation处理网络请求 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; //使用JSON序列化 operation.responseSerializer = [AFJSONResponseSerializer serializer]; //请求成功处理返回json数据,自动转为字典类型;请求失败弹出提示 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { // 3将返回数据序列化,返回的字典赋值给属性weather self.weather = (NSDictionary *)responseObject; self.title = @"获取到JSON"; [self.tableView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 失败提示 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"获取天气信息失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }]; [operation start]; } //plist数据 - (IBAction)plistTapped:(id)sender { NSString *string = [NSString stringWithFormat:@"%@weather.php?format=plist", BaseURLString]; NSURL *url = [NSURL URLWithString:string]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; // 解析plist就必须设置序列化对象为AFPropertyListResponseSerializer operation.responseSerializer = [AFPropertyListResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { self.weather = (NSDictionary *)responseObject; self.title = @"获取到PLIST"; [self.tableView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"获取天气信息失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }]; [operation start]; } //xml数据 - (IBAction)xmlTapped:(id)sender { NSString *string = [NSString stringWithFormat:@"%@weather.php?format=xml", BaseURLString]; NSURL *url = [NSURL URLWithString:string]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; // Make sure to set the responseSerializer correctly operation.responseSerializer = [AFXMLParserResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSXMLParser *XMLParser = (NSXMLParser *)responseObject; [XMLParser setShouldProcessNamespaces:YES]; //解析XML数据要复杂许多,参考代理实现 XMLParser.delegate = self; [XMLParser parse]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"获取天气信息失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }]; [operation start]; } #pragma mark - NSXMLParserDelegate //开始解析 - (void)parserDidStartDocument:(NSXMLParser *)parser { self.xmlWeather = [NSMutableDictionary dictionary]; } //找到新标签解析 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { self.elementName = qName; if([qName isEqualToString:@"current_condition"] || [qName isEqualToString:@"weather"] || [qName isEqualToString:@"request"]) { self.currentDictionary = [NSMutableDictionary dictionary]; } self.outstring = [NSMutableString string]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (!self.elementName) return; [self.outstring appendFormat:@"%@", string]; } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([qName isEqualToString:@"current_condition"] || [qName isEqualToString:@"request"]) { self.xmlWeather[qName] = @[self.currentDictionary]; self.currentDictionary = nil; } else if ([qName isEqualToString:@"weather"]) { // Initialize the list of weather items if it doesn't exist NSMutableArray *array = self.xmlWeather[@"weather"] ?: [NSMutableArray array]; // Add the current weather object [array addObject:self.currentDictionary]; // Set the new array to the "weather" key on xmlWeather dictionary self.xmlWeather[@"weather"] = array; self.currentDictionary = nil; } else if ([qName isEqualToString:@"value"]) { // Ignore value tags, they only appear in the two conditions below } else if ([qName isEqualToString:@"weatherDesc"] || [qName isEqualToString:@"weatherIconUrl"]) { NSDictionary *dictionary = @{@"value": self.outstring}; NSArray *array = @[dictionary]; self.currentDictionary[qName] = array; } else if (qName) { self.currentDictionary[qName] = self.outstring; } self.elementName = nil; } - (void)parserDidEndDocument:(NSXMLParser *)parser { self.weather = @{@"data": self.xmlWeather}; self.title = @"XML Retrieved"; [self.tableView reloadData]; }
AFHTTPRequestOperation
3.然后你在运行,点击JSON,XML或者PLIST按钮看看效果。我的APP效果如图:
实战3:使用AFHTTPSessionManager方法实现GET和POST请求
1.找到找到WTTableViewController.m文件中的clientTapped:方法,给它添加一个弹出菜单选择GET和Post请求,替换代码如下:
/*知识点3:AFHTTPSessionManager iOS7之后,使用AFHTTPSessionManager iOS6之后,使用AFHTTPRequestOperationManager 使用方便,只要我们设置一个服务器的URL地址,在设置请求参数字典 GET 和 POST请求 使用基本相同,这是AFNetworking牛逼的地方,都帮我们封装好了参数 */ - (IBAction)clientTapped:(id)sender { //弹出菜单 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"AFHTTPSessionManager" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"HTTP GET", @"HTTP POST", nil]; [actionSheet showFromBarButtonItem:sender animated:YES];
clientTapped:
2.然后WTTableViewControlle类继承UIActionSheetDelegate。
@interface WTTableViewController ()<NSXMLParserDelegate,CLLocationManagerDelegate,UIActionSheetDelegate>
3.实现代理方法,在上面代码下面添加actionSheet:clickedButtonAtIndex:代理方法:
#pragma mark - UIActionSheetDelegate - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == [actionSheet cancelButtonIndex]) { // User pressed cancel -- abort return; } // 设置请求URL和请求参数 NSURL *baseURL = [NSURL URLWithString:BaseURLString]; NSDictionary *parameters = @{@"format":@"json"}; // 初始化AFHTTPSessionManager对象,并设置JSON序列化 AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; // GET请求方式 ) { [manager GET:@"weather.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { self.weather = responseObject; self.title = @"HTTP GET"; [self.tableView reloadData]; } failure:^(NSURLSessionDataTask *task, NSError *error) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"获取天气信息失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }]; } // POST请求方式 ) { [manager POST:@"weather.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { self.weather = responseObject; self.title = @"HTTP POST"; [self.tableView reloadData]; } failure:^(NSURLSessionDataTask *task, NSError *error) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"获取天气信息失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alertView show]; }]; } }
UIActionSheetDelegate
4.运行看看效果,当我们点击请求方式,会弹出选择菜单,我们选择任意一种请求方式,都能得到我们的天气数据:
实战3:使用AFHTTPSessionManager获取实时数据
使用AFHTTPSessionManager获取服务器数据,建议封装网络层。 1.为每一个网络服务创建一个AFHTTPSessionManager的子类 2.在每个子类中,创建一个单例方法。3.在该类中请求网络数据。
1.新建WeatherHTTPClient类,使其继承AFHTTPSessionManager。类的实现代码如下:
WeatherHTTPClient.h文件
#import "AFHTTPSessionManager.h" @protocol WeatherHTTPClientDelegate; /** * 封装网络请求 */ @interface WeatherHTTPClient : AFHTTPSessionManager @property (nonatomic, weak) id<WeatherHTTPClientDelegate>delegate; /** * 单例方法 * * @return 返回当前对象 */ + (WeatherHTTPClient *)sharedWeatherHTTPClient; /** * 初始化对象 * * @param url 请求的URL * * @return 返回当前对象 */ - (instancetype)initWithBaseURL:(NSURL *)url; /** * 根据地理位置以及天数,来请求服务器多少天的该地理位置的天气数据 * * @param location 地理位置 * @param number 天数 */ - (void)updateWeatherAtLocation:(CLLocation *)location forNumberOfDays:(NSUInteger)number; @end /** * 协议,用于代理回调 */ @protocol WeatherHTTPClientDelegate <NSObject> @optional - (void)weatherHTTPClient:(WeatherHTTPClient *)client didUpdateWithWeather:(id)weahter; - (void)weatherHTTPClient:(WeatherHTTPClient *)client didFailWithError:(NSError *)error; @end
WeatherHTTPClient.h
WeatherHTTPClient.m文件
#import "WeatherHTTPClient.h" /** 这里我们用到的实时数据来自World Weather Online的实时天气数据,您可以使用我这个API进行测试,不过建议您自己注册一个API,注册地址:https://developer.worldweatheronline.com/member/register 注册用户,然后验证邮箱,然后注册APP,你可以注册Free-Weather-API-V2和Premium-Weather-API 不过访问的地址Base URL不同: Free API: HTTP: http://api.worldweatheronline.com/free/v2/weather.ashx HTTPS: https://api.worldweatheronline.com/free/v2/weather.ashx Premium API: HTTP: http://api.worldweatheronline.com/premium/v1/weather.ashx HTTPS: https://api.worldweatheronline.com/premium/v1/weather.ashx 查看API文档 http://www.worldweatheronline.com/api/docs/local-city-town-weather-api.aspx */ static NSString * const WorldWeatherOnlineAPIKey = @"cb0e4506e3590fdd85bbd9b2a9fc8"; static NSString * const WorldWeatherOnlineURLString = @"http://api.worldweatheronline.com/free/v2/"; @implementation WeatherHTTPClient //单例 + (WeatherHTTPClient *)sharedWeatherHTTPClient { static WeatherHTTPClient *_sharedWeatherHTTPClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedWeatherHTTPClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:WorldWeatherOnlineURLString]]; }); return _sharedWeatherHTTPClient; } //根据URL初始化,并默认为JSON序列化 - (instancetype)initWithBaseURL:(NSURL *)url { self = [super initWithBaseURL:url]; if (self) { self.responseSerializer = [AFJSONResponseSerializer serializer]; self.requestSerializer = [AFJSONRequestSerializer serializer]; } return self; } - (void)updateWeatherAtLocation:(CLLocation *)location forNumberOfDays:(NSUInteger)number { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; parameters[@"num_of_days"] = @(number); parameters[@"q"] = [NSString stringWithFormat:@"%f,%f",location.coordinate.latitude,location.coordinate.longitude]; parameters[@"format"] = @"json"; parameters[@"key"] = WorldWeatherOnlineAPIKey; [self GET:@"weather.ashx" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { if ([self.delegate respondsToSelector:@selector(weatherHTTPClient:didUpdateWithWeather:)]) { [self.delegate weatherHTTPClient:self didUpdateWithWeather:responseObject]; } } failure:^(NSURLSessionDataTask *task, NSError *error) { if ([self.delegate respondsToSelector:@selector(weatherHTTPClient:didFailWithError:)]) { [self.delegate weatherHTTPClient:self didFailWithError:error]; } }]; } @end
WeatherHTTPClient.m
2.在WTTableViewController.m文件中找到locationManager:didUpdateLocations:方法,替换成如下代码:
#pragma mark - CLLocationManagerDelegate - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { // 获取最新的位置信息 CLLocation *newLocation = [locations lastObject]; // 如果新位置在5分钟之前就不更新 ) return; //获取到新位置就停止更新 [self.locationManager stopUpdatingLocation]; /*知识5:使用AFHTTPSessionManager的建议:封装网络层请求 1.为每一个网络服务创建一个AFHTTPSessionManager的子类 2.在每个子类中,创建一个单例方法 */ WeatherHTTPClient *client = [WeatherHTTPClient sharedWeatherHTTPClient]; client.delegate = self; [client updateWeatherAtLocation:newLocation forNumberOfDays:]; }
CLLocationManagerDelegate
3.然后我们运行(最好在真机运行,模拟器可能获取不到经纬度信息),点击“本地天气”按钮,这是我的效果,北京又是个大雾霾天。希望您那的天气很美好。
实战4.利用AFNetworkActivityIndicatorManager显示加载提示
我们现在已经可以利用AFNetworling2.0的类轻易获取到数据,可是,在加载数据的时候,如果网络慢的情况下,用户并不知道发生了什么,这样子的用户体验不太好不是吗,所以我们需要提示用户正在请求数据,AFNetworking已经为我们考虑了这些,而且使用很方便。
1.打开WTAppDelegate.m文件,找到application:didFinishLaunchingWithOptions:方法,在返回前添加如下代码:
/*知识点4:AFNetworkActivityIndicatorManager让我们很容易的指导网络是否在请求,如果在向网络请求数据就会在状态来出现一个旋转的提示,如果请求结束或者无请求,提示消失,使用方便简单*/ [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
2.OK,这么多就够了。我运行看看吧,注意下状态栏,在我们选择JSON,XML或PLIST等按钮时,会出现一个加载提示,当数据获取后,加载提示又会消失。
实战5.使用AFImageResponseSerializer序列化图片数据
从服务器返回的数据会有各种类型,有JOSN,XML,PLIST等,有时候也会直接获取一张图片,这时候苹果原生技术职能用NSData的方式获取数据,然后再转换数据,而AFNetwroking确可以直接序列化图片数据,一个小技巧而已。
1.找到WeatherAnimationViewController.m文件,找到updateBackgroundImage:方法,替换为如下代码:
- (IBAction)updateBackgroundImage:(id)sender { NSURL *url = [NSURL URLWithString:@"http://www.raywenderlich.com/wp-content/uploads/2014/01/sunny-background.png"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; //设置为图片序列化方式,如果我们确定获取到的数据为图片,就可以这么做 operation.responseSerializer = [AFImageResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { self.backgroundImageView.image = responseObject; [self saveImage:responseObject withFilename:@"background.png"]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; [operation start]; }
updateBackgroundImage:
2.找到deleteBackgroundImage:方法,替换为如下代码:
- (IBAction)deleteBackgroundImage:(id)sender { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:] stringByAppendingPathComponent:@"WeatherHTTPClientImages/"]; NSError *error = nil; [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; NSString *desc = [self.weatherDictionary weatherDescription]; [self start:desc]; }
3.这个方法会删除我们刚刚更新的背景图片。我们可以再次运行看看,测试下更新背景图和删除按钮把。
自此我们的实战就算完成了。辛苦各位亲了,不过再麻烦大家耐心一点,我们花一点点的时间,来总结一下如何利用AFNetworking来请求外部网络数据:
1.我们可以使用AFNetworkReachabilityManager来监控网络状态的变化,如WiFi,WWAN,或者关闭网络等状态。
2.我们可以使用AFHTTPOperation配合AFJSONResponseSerializer、AFPropertyListResponseSerializer、AFXMLParserResponseSerializer、AFImageResponseSerializer等序列化方式,请求网络数据。
3.我们可以使用AFNetworkActivityIndicatorManager,在网络请求时,给用户友好的请求提示显示。
4.我们AFHTTPSessionManager为网络请求设置参数,根据需要更改请求参数,从而实时的请求数据。
谢谢各位亲。
AFNETWorking3.x实战教程的更多相关文章
- 【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合
[ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整 ...
- 【转】mybatis实战教程(mybatis in action),mybatis入门到精通
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...
- NDK-JNI实战教程(二) JNI官方中文资料
声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
- ActiveReports 9实战教程(3): 图文并茂的报表形式
基于上面2节内容,我们搭建了AR9的开发环境,配置好了数据源.在本节,我们以官方提供的3个中文图文并茂的报表来展示AR9的功能,并通过实战的方式一一分享. 以往做报表相关的工作时,最害怕的是报表的UI ...
- 《软件性能测试与LoadRunner实战教程》新书上市
作者前三本书<软件性能测试与LoadRunner实战>.<精通软件性能测试与LoadRunner实战>和<精通软件性能测试与LoadRunner最佳实战>面市后,受 ...
- BI之SSAS完整实战教程7 -- 设计维度、细化维度中 :浏览维度,细化维度
上篇文章我们已经将Dim Geography维度设计好. 若要查看维度的成员, AS需要接收该维度的详细信息(包括已创建的特性.成员属性以及多级层次结构), 通过XMLA与AS的实例进行通信. 今天我 ...
- BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系
前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导 ...
- BI之SSAS完整实战教程5 -- 详解多维数据集结构
之前简单介绍过多维数据集(Cube)的结构. 原来计划将Cube结构这部分内容打散,在实验中穿插讲解, 考虑到结构之间不同的部分都有联系,如果打散了将反而不好理解,还是直接一次性全部讲完. 本篇我们将 ...
随机推荐
- xcode6 devices,profiles 以及 iOS8 设备 查看profiles
xcode6 devices,profiles 以及 iOS8 设备 查看profiles 1. xocde6 devices 不在 window----Organizer 下面了: 改为 Windo ...
- java 多线程4(死锁)
死锁现象: 死锁原因: 1.存在两个或两个以上的线程. 2.存在两个或两个或两个以上的共享资源. 死锁现象解决的方案: 没有方案只能尽量避免.
- 在IIS7.5打开网页的时候,提示: HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.dll" 上。解决方法
- 鸟哥的linux私房菜勘误表
博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://ww ...
- 【CITE】C#默认以管理员身份运行程序实现代码
//用于一种情况:C#软件打包后,在读写C盘文件时,会出现权限问题.使用管理员身份才可以运行 using System; using System.Collections.Generic; using ...
- [HBuilder] 简介
官网首页: http://www.dcloud.io/runtime.html 特点: 编码比其他工具快5倍 代码输入法:按下数字快速选择候选项 可编程代码块:一个代码块,少敲50个按键 内置emme ...
- FireFox背景亮度修改
安装stylish 输入:body{filter: brightness(80%);}
- jQuery 2.0.3 源码分析 bind/live/delegate/on
传统的时间处理: 给某一个元素绑定一个点击事件,传入一个回调句柄处理 element.addEventListener('click',doSomething,false); 这样的绑定如果页面上面有 ...
- mvc伪静态<四> 伪静态后静态页面或者引用的css和图片失效
引用的css和图片失效的解决办法 把样式引用文件的相对路径改成绝对路径就可以了 比如原先的引用路径为:<link href="~/Content/css/style.css" ...
- 20145236 《Java程序设计》实验五实验报告
20145236 实验五 Java网络编程 实验内容 1.运行TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TC ...