5singios下载缓存能听吗ios

99+条站内信
1条系统消息
iosmimuxkuiOS 数据库离线缓存思路和网络层封装
招聘信息:
作者: 投稿。一直想总结一下关于iOS的离线数据缓存的方面的问题,然后最近也简单的对AFN进行了再次封装,所有想把这两个结合起来写一下。数据展示型的页面做离线缓存可以有更好的用户体验,用户在离线环境下仍然可以获取一些数据,这里的数据缓存首选肯定是SQLite,轻量级,对数据的存储读取相对于其他几种方式有优势,这里对AFN的封装没有涉及太多业务逻辑层面的需求,主要还是对一些方法再次封装方便使用,解除项目对第三方的耦合性,能够简单的快速的更换底层使用的网络请求代码。这篇主要写离线缓存思路,对AFN的封装只做简单的介绍。关于XLNetworkApiXLNetworkApi的一些功能和说明:使用XLNetworkRequest做一些GET、POST、PUT、DELETE请求,与业务逻辑对接部分直接以数组或者字典的形式返回。以及网络下载、上传文件,以block的形式返回实时的下载、上传进度,上传文件参数通过模型XLFileConfig去存取。通过继承于XLDataService来将一些数据处理,模型转化封装起来,于业务逻辑对接返回的是对应的模型,减少Controllor处理数据处理逻辑的压力。自定义一些回调的block/**
请求成功block
typedef&void&(^requestSuccessBlock)(id&responseObj);
请求失败block
typedef&void&(^requestFailureBlock)&(NSError&*error);
请求响应block
typedef&void&(^responseBlock)(id&dataObj,&NSError&*error);
监听进度响应block
typedef&void&(^progressBlock)(int64_t&bytesWritten,&int64_t&totalBytesWritten,&int64_t&totalBytesExpectedToWrite);XLNetworkRequest.m部分实现#import&"XLNetworkRequest.h"
#import&"AFNetworking.h"
@implementation&XLNetworkRequest
+&(void)getRequest:(NSString&*)url&params:(NSDictionary&*)params&success:(requestSuccessBlock)successHandler&failure:(requestFailureBlock)failureHandler&{
//网络不可用
&&if&(![self&checkNetworkStatus])&{
&&&&&&successHandler(nil);
&&&&&&failureHandler(nil);
&&AFHTTPRequestOperationManager&*manager&=&[self&getRequstManager];
&&[manager&GET:url&parameters:params&success:^(AFHTTPRequestOperation&*&_Nonnull&operation,&id&&_Nonnull&responseObject)&{
&&&&&&successHandler(responseObject);
&&}&failure:^(AFHTTPRequestOperation&*&_Nullable&operation,&NSError&*&_Nonnull&error)&{
&&&&&&XLLog(@"------请求失败-------%@",error);
&&&&&&failureHandler(error);
}下载部分代码//下载文件,监听下载进度
+&(void)downloadRequest:(NSString&*)url&successAndProgress:(progressBlock)progressHandler&complete:(responseBlock)completionHandler&{
&&if&(![self&checkNetworkStatus])&{
&&&&&&progressHandler(0,&0,&0);
&&&&&&completionHandler(nil,&nil);
&&NSURLSessionConfiguration&*sessionConfiguration&=&[NSURLSessionConfiguration&defaultSessionConfiguration];
&&AFURLSessionManager&*manager&=&[[AFURLSessionManager&alloc]&initWithSessionConfiguration:sessionConfiguration];
&&NSURLRequest&*request&=&[NSURLRequest&requestWithURL:[NSURL&URLWithString:url]];
&&NSProgress&*kProgress&=&
&&NSURLSessionDownloadTask&*downloadTask&=&[manager&downloadTaskWithRequest:request&progress:&kProgress&destination:^NSURL&*&_Nonnull(NSURL&*&_Nonnull&targetPath,&NSURLResponse&*&_Nonnull&response)&{
&&&&&&NSURL&*documentUrl&=&[[NSFileManager&defaultManager]&URLForDirectory&:NSDocumentDirectory&inDomain:NSUserDomainMask&appropriateForURL:nil&create:NO&error:nil];
&&&&&&return&[documentUrl&URLByAppendingPathComponent:[response&suggestedFilename]];
&&}&completionHandler:^(NSURLResponse&*&_Nonnull&response,&NSURL&*&_Nonnull&filePath,&NSError&*&_Nonnull&error){
&&&&&&if&(error)&{
&&&&&&&&&&XLLog(@"------下载失败-------%@",error);
&&&&&&completionHandler(response,&error);
&&[manager&setDownloadTaskDidWriteDataBlock:^(NSURLSession&*&_Nonnull&session,&NSURLSessionDownloadTask&*&_Nonnull&downloadTask,&int64_t&bytesWritten,&int64_t&totalBytesWritten,&int64_t&totalBytesExpectedToWrite)&{
&&&&&&progressHandler(bytesWritten,&totalBytesWritten,&totalBytesExpectedToWrite);
&&[downloadTask&resume];
}上传部分代码//上传文件,监听上传进度
+&(void)updateRequest:(NSString&*)url&params:(NSDictionary&*)params&fileConfig:(XLFileConfig&*)fileConfig&successAndProgress:(progressBlock)progressHandler&complete:(responseBlock)completionHandler&{
&&if&(![self&checkNetworkStatus])&{
&&&&&&progressHandler(0,&0,&0);
&&&&&&completionHandler(nil,&nil);
&&NSMutableURLRequest&*request&=&[[AFHTTPRequestSerializer&serializer]&multipartFormRequestWithMethod:@"POST"&URLString:url&parameters:params&constructingBodyWithBlock:^(id&&_Nonnull&formData)&{
&&&&&&[formData&appendPartWithFileData:fileConfig.fileData&name:fileConfig.name&fileName:fileConfig.fileName&mimeType:fileConfig.mimeType];
&&}&error:nil];
&&//获取上传进度
&&AFHTTPRequestOperation&*operation&=&[[AFHTTPRequestOperation&alloc]&initWithRequest:request];
&&[operation&setUploadProgressBlock:^(NSUInteger&bytesWritten,&long&long&totalBytesWritten,&long&long&totalBytesExpectedToWrite)&{
&&&&&&progressHandler(bytesWritten,&totalBytesWritten,&totalBytesExpectedToWrite);
&&[operation&setCompletionBlockWithSuccess:^(AFHTTPRequestOperation&*&_Nonnull&operation,&id&&_Nonnull&responseObject)&{
&&&&&&completionHandler(responseObject,&nil);
&&}&failure:^(AFHTTPRequestOperation&*&_Nonnull&operation,&NSError&*&_Nonnull&error)&{
&&&&&&completionHandler(nil,&error);
&&&&&&if&(error)&{
&&&&&&&&&&XLLog(@"------上传失败-------%@",error);
&&[operation&start];
}XLDataService.m部分实现+&(void)getWithUrl:(NSString&*)url&param:(id)param&modelClass:(Class)modelClass&responseBlock:(responseBlock)responseDataBlock&{
&&&&&&[XLNetworkRequest&getRequest:url&params:param&success:^(id&responseObj)&{
&&&&&&//数组、字典转化为模型数组
&&&&&&dataObj&=&[self&modelTransformationWithResponseObj:responseObj&modelClass:modelClass];
&&&&&&responseDataBlock(dataObj,&nil);
&&}&failure:^(NSError&*error)&{
&&&&&&responseDataBlock(nil,&error);
}(关键)下面这个方法提供给继承XLDataService的子类重写,将转化为模型的代码写在这里,相似业务的网络数据请求都可以用这个子类去请求数据,直接返回对应的模型数组。/**
数组、字典转化为模型
+&(id)modelTransformationWithResponseObj:(id)responseObj&modelClass:(Class)modelClass&{
&&&&&return&
}关于离线数据缓存当用户进入程序的展示页面,有三个情况下可能涉及到数据库存取操作,简单画了个图来理解,思路比较简单,主要是一些存取的细节处理。进入展示页面下拉刷新最新数据上拉加载更多数据需要注意的是,上拉加载更多的时候,每次从数据库返回一定数量的数据,而不是一次性将数据全部加载,否则会有内存问题,直到数据库中没有更多数据时再发生网络请求,再次将新数据存入数据库。这里存储数据的方式是将服务器返回每组数据的字典归档成二进制作为数据库字段直接存储,这样存储在模型属性比较多的情况下更有好处,避免每一个属性作为一个字段,另外增加了一个idStr字段用来判断数据的唯一性,避免重复存储。首先定义一个工具类XLDataBase来做数据库相关的操作,这里用的是第三方的FMDB。#import&"XLDataBase.h"
#import&"FMDatabase.h"
#import&"Item.h"
#import&"MJExtension.h"
@implementation&XLDataBase
static&FMDatabase&*_
+&(void)initialize&{
&&&&NSString&*path&=&[NSString&stringWithFormat:@"%@/Library/Caches/Data.db",NSHomeDirectory()];
&&&&_db&=&[FMDatabase&databaseWithPath:path];
&&&&[_db&open];
&&&&[_db&executeUpdate:@"CREATE&TABLE&IF&NOT&EXISTS&t_item&(id&integer&PRIMARY&KEY,&itemDict&blob&NOT&NULL,&idStr&text&NOT&NULL)"];
//存入数据库
+&(void)saveItemDict:(NSDictionary&*)itemDict&{
&&&&//此处把字典归档成二进制数据直接存入数据库,避免添加过多的数据库字段
&&&&NSData&*dictData&=&[NSKeyedArchiver&archivedDataWithRootObject:itemDict];
&&&&[_db&executeUpdateWithFormat:@"INSERT&INTO&t_item&(itemDict,&idStr)&VALUES&(%@,&%@)",dictData,&itemDict[@"id"]];
//返回全部数据
+&(NSArray&*)list&{
&&&&FMResultSet&*set&=&[_db&executeQuery:@"SELECT&*&FROM&t_item"];
&&&&NSMutableArray&*list&=&[NSMutableArray&array];
&&&&while&(set.next)&{
&&&&&&&&//&获得当前所指向的数据
&&&&&&&&NSData&*dictData&=&[set&objectForColumnName:@"itemDict"];
&&&&&&&&NSDictionary&*dict&=&[NSKeyedUnarchiver&unarchiveObjectWithData:dictData];
&&&&&&&&[list&addObject:[Item&mj_objectWithKeyValues:dict]];
&&&&return&
//取出某个范围内的数据
+&(NSArray&*)listWithRange:(NSRange)range&{
&&&&NSString&*SQL&=&[NSString&stringWithFormat:@"SELECT&*&FROM&t_item&LIMIT&%lu,&%lu",range.location,&range.length];
&&&&FMResultSet&*set&=&[_db&executeQuery:SQL];
&&&&NSMutableArray&*list&=&[NSMutableArray&array];
&&&&while&(set.next)&{
&&&&&&&&NSData&*dictData&=&[set&objectForColumnName:@"itemDict"];
&&&&&&&&NSDictionary&*dict&=&[NSKeyedUnarchiver&unarchiveObjectWithData:dictData];
&&&&&&&&[list&addObject:[Item&mj_objectWithKeyValues:dict]];
&&&&return&
//通过一组数据的唯一标识判断数据是否存在
+&(BOOL)isExistWithId:(NSString&*)idStr
&&&&BOOL&isExist&=&NO;
&&&&FMResultSet&*resultSet=&[_db&executeQuery:@"SELECT&*&FROM&t_item&where&idStr&=&?",idStr];
&&&&while&([resultSet&next])&{
&&&&&&&&if([resultSet&stringForColumn:@"idStr"])&{
&&&&&&&&&&&&isExist&=&YES;
&&&&&&&&}else{
&&&&&&&&&&&&isExist&=&NO;
&&&&return&isE
@end一些继承于XLDataService的子类的数据库存储和模型转换的逻辑代码#import&"GetTableViewData.h"
#import&"XLDataBase.h"
@implementation&GetTableViewData
//重写父类方法
+&(id)modelTransformationWithResponseObj:(id)responseObj&modelClass:(Class)modelClass&{
&&&&NSArray&*lists&=&responseObj[@"data"][@"list"];
&&&&NSMutableArray&*array&=&[NSMutableArray&array];
&&&&for&(NSDictionary&*dict&in&lists)&{
&&&&&&&&[modelClass&mj_setupReplacedKeyFromPropertyName:^NSDictionary&*{
&&&&&&&&&&&&return&@{&@"ID"&:&@"id"&};
&&&&&&&&}];
&&&&&&&&[array&addObject:[modelClass&mj_objectWithKeyValues:dict]];
&&&&&&&&//通过idStr先判断数据是否存储过,如果没有,网络请求新数据存入数据库
&&&&&&&&if&(![XLDataBase&isExistWithId:dict[@"id"]])&{
&&&&&&&&&&&&//存数据库
&&&&&&&&&&&&NSLog(@"存入数据库");
&&&&&&&&&&&&[XLDataBase&saveItemDict:dict];
&&&&return&
}下面是一些控制器的代码实现:#import&"ViewController.h"
#import&"GetTableViewData.h"
#import&"Item.h"
#import&"XLDataBase.h"
#import&"ItemCell.h"
#import&"MJRefresh.h"
#define&URL_TABLEVIEW&@"/mobile/v3/EventList?cityId=1&step=10&theme=0&page=%lu"
@interface&ViewController&()&{
&&&&NSMutableArray&*_dataA
&&&&UITableView&*_tableV
&&&&NSInteger&_currentP//当前数据对应的page
@implementation&ViewController
#pragma&mark&Life&cycle
-&(void)viewDidLoad&{
&&&&[super&viewDidLoad];
&&&&//&Do&any&additional&setup&after&loading&the&view,&typically&from&a&nib.
&&&&[self&createTableView];
&&&&_dataArray&=&[NSMutableArray&array];
-&(void)viewWillAppear:(BOOL)animated&{
&&&&[super&viewWillAppear:animated];
&&&&NSRange&range&=&NSMakeRange(0,&10);
&&&&//如果数据库有数据则读取,不发送网络请求
&&&&if&([[XLDataBase&listWithRange:range]&count])&{
&&&&&&&&[_dataArray&addObjectsFromArray:[XLDataBase&listWithRange:range]];
&&&&&&&&NSLog(@"从数据库加载");
&&&&}else{
&&&&&&&&[self&getTableViewDataWithPage:0];
#pragma&mark&UI
-&(void)createTableView&{
&&&&_tableView&=&[[UITableView&alloc]&initWithFrame:self.view.bounds];
&&&&_tableView.delegate&=&
&&&&_tableView.dataSource&=&
&&&&_tableView.rowHeight&=&100.0;
&&&&[self.view&addSubview:_tableView];
&&&&_tableView.mj_header&=&[MJRefreshNormalHeader&headerWithRefreshingBlock:^{
&&&&&&&&[self&loadNewData];
&&&&_tableView.mj_footer&=&[MJRefreshAutoNormalFooter&footerWithRefreshingBlock:^{
&&&&&&&&[self&loadMoreData];
#pragma&mark&GetDataSoure
-&(void)getTableViewDataWithPage:(NSInteger)page&{
&&&&NSLog(@"发送网络请求!");
&&&&NSString&*url&=&[NSString&stringWithFormat:URL_TABLEVIEW,&page];
&&&&[GetTableViewData&getWithUrl:url&param:nil&modelClass:[Item&class]&responseBlock:^(id&dataObj,&NSError&*error)&{
&&&&&&&&[_dataArray&addObjectsFromArray:dataObj];
&&&&&&&&[_tableView&reloadData];
&&&&&&&&[_tableView.mj_header&endRefreshing];
&&&&&&&&[_tableView.mj_footer&endRefreshing];
-&(void)loadNewData&{
&&&&NSLog(@"下拉刷新");
&&&&_currentPage&=&0;
&&&&[_dataArray&removeAllObjects];
&&&&[self&getTableViewDataWithPage:_currentPage];
-&(void)loadMoreData&{
&&&&NSLog(@"上拉加载");
&&&&_currentPage&++;
&&&&NSRange&range&=&NSMakeRange(_currentPage&*&10,&10);
&&&&if&([[XLDataBase&listWithRange:range]&count])&{
&&&&&&&&[_dataArray&addObjectsFromArray:[XLDataBase&listWithRange:range]];
&&&&&&&&[_tableView&reloadData];
&&&&&&&&[_tableView.mj_footer&endRefreshing];
&&&&&&&&NSLog(@"数据库加载%lu条更多数据",[[XLDataBase&listWithRange:range]&count]);
&&&&}else{
&&&&&&&&//数据库没更多数据时再网络请求
&&&&&&&&[self&getTableViewDataWithPage:_currentPage];
#pragma&mark&UITableViewDataSource
-&(NSInteger)tableView:(UITableView&*)tableView&numberOfRowsInSection:(NSInteger)section&{
&&&&return&_dataArray.
-&(UITableViewCell&*)tableView:(UITableView&*)tableView&cellForRowAtIndexPath:(NSIndexPath&*)indexPath&{
&&&&ItemCell&*cell&=&[ItemCell&itemCellWithTableView:tableView];
&&&&cell.item&=&_dataArray[indexPath.row];
&&&&return&
@end最后附上代码的下载地址,重要的部分代码中都有相应的注释和文字打印,运行程序可以很直观的表现。希望大家能提出一些意见,很乐意与大家互相交流。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量17423点击量11185点击量9297点击量8518点击量8483点击量7847点击量7676点击量6129点击量5712
&2015 Chukong Technologies,Inc.
京公网安备89用小米3在5singAPP上听歌,换了一-中国学网-中国IT综合门户网站
> 信息中心 >
用小米3在5singAPP上听歌,换了一
来源:互联网 发表时间: 15:27:16 责任编辑:王亮字体:
为了帮助网友解决“用小米3在5singAPP上听歌,换了一”相关的问题,中国学网通过互联网对“用小米3在5singAPP上听歌,换了一”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:用小米3在5singAPP上听歌,换了一首歌然后关掉屏幕声音一直卡着听一下卡一下,屏幕也开不了关机不了,具体解决方案如下:解决方案1:
进入RECOVERY模式按住电源键和音量上键,清除下缓存,重新进入系统一
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
1个回答3个回答5个回答3个回答3个回答1个回答1个回答4个回答14个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号子曰:学而不思则罔,思而不学则殆。在上一篇文章中: 提到EGOCache可以设定缓存过期时间,默认是1天。查看了一下EGOCache源码,设置默认时间:
[self setDefaultTimeoutInterval:86400];
//86400 = 24 * 60 * 60 刚好是一天时间。EGOCache为什么要提供设定缓存过期时间呢?或者说设定缓存过期时间有什么好处呢?我觉得最大的好处就是可以定时清除缓存。可以设置某一项的缓存时间,很方便管理缓存。那么问题来了:EGOCache是怎么检测缓存过期时间的呢?检测到时间过期之后,什么时候触发删除缓存项的?带着这两个问题,我们来继续分析。你会怎么实现记得在公司里,老板经常会举这样的例子:某某同志,刚来我们公司的时候,遇到问题就知道抱怨。从来不知道去思考怎么解决,只知道把问题抛给领导。工作半年下来,成长了很多。现在碰到问题,不仅把问题抛出来,而且还提供了自己的解决方案...类似的例子,相信大家都听过。同样,既然前面我们提出这两个问题,我们也先来思考一下,如果我们来做该怎么解决?如果让我来写的话,我脑海里初步实现方法有几个:通过定时器来轮询,每隔一段时间检测一次。写一个while循环来检测。每次去读取缓存项的时候,判断缓存时间有没有过期。没过期,就返回读取的缓存项;否则,返回nil。当然,还有一些方法,不一一例举了。仔细想想,这些方法弊端很容易显露出来。为了小小的缓存时间,就用定时器轮询,显然是资源浪费跟方法1差不多。每次读取的时候判断是否过期,如果一直不读取,app的缓存会越来越大,也不可取。这些方法都被排除了,还有好的方法吗?继续往下看:EGOCache是怎么实现的?仔细查看EGOCache源码,发现在initWithCacheDirectory:方法里,每次初始化EGOCache实例对象的时,会遍历一遍plist文件中所有已存在的缓存项,拿每个缓存项的时间和当前时间作比较,缓存项过期时间早于当前时间,则删除对应缓存文件,并删除 plist 文件中对应 key 的记录。具体实现代码如下:读取缓存项信息_cacheInfo = [[NSDictionary dictionaryWithContentsOfFile:cachePathForKey(_directory, @&EGOCache.plist&)] mutableCopy];
if(!_cacheInfo) {
_cacheInfo = [[NSMutableDictionary alloc] init];
}获取当前时间的NSTimeIntervalNSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate];声明removedKeys保存过期的缓存项对应的keyNSMutableArray* removedKeys = [[NSMutableArray alloc] init];遍历缓存项信息并判断缓存时间for(NSString* key in _cacheInfo) {
//判断缓存项过期时间是否早于当前时间
if([_cacheInfo[key] timeIntervalSinceReferenceDate] &= now) {
//如果缓存项过期时间早于当前时间,移除缓存项
[[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
//把过期的缓存项对于的key保存到removedKeys里面
[removedKeys addObject:key];
}删除过期缓存项对于的key[_cacheInfo removeObjectsForKeys:removedKeys];看到这些,是不是觉得人家思路特牛叉,反正,我是觉得这个作者不简单。到这一步就解决了吗?EGOCache还做了什么?细心的童鞋会发现:EGOCache是个单列类,也就是说整个程序应用周期只初始化一次。+ (instancetype)globalCache {
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
}每次初始化的时候去判断了缓存项是否过期,这样做非常正确。思考一个场景:用户打开app,EGOCache被初始化,并判断了缓存项是否过期。如果刚好有一些缓存项在EGOCache被初始化之后过期。这个时候我们依然可以读到这个缓存项。这就不对了。继续分析EGOCache源码发现,EGOCache在读取一个缓存项的时候,先判断缓存项是否存在,然后读取缓存项(注意:是读取EGOCache初始化的时候没有过期的缓存项,并没有说现在没有过期),最后去判断读取到的缓存项跟当前时间相比是否过期.具体实现如下:- (BOOL)hasCacheForKey:(NSString*)key {
//读取EGOCache初始化的时候没有过期的缓存项
NSDate* date = [self dateForKey:key];
if(date == nil) return NO;
//判断读取到的缓存项当前是否过期
if([date timeIntervalSinceReferenceDate] & CFAbsoluteTimeGetCurrent()) return NO;
return [[NSFileManager defaultManager] fileExistsAtPath:cachePathForKey(_directory, key)];
- (NSDate*)dateForKey:(NSString*)key {
__block NSDate* date =
dispatch_sync(_frozenCacheInfoQueue, ^{
date = (self.frozenCacheInfo)[key];
}EGOCache检测缓存时间过期的思路值得学习,以后遇到类似场景,完全可以借鉴。1.
 文章为作者独立观点,不代表微头条立场
的最新文章
来源:本文源自网络,版权归原作者所有每次一回家,看到各种亲戚就觉得不敢和他们说话,不敢提钱,不敢提工作,原因一.iPhone创建个人热点iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal作者:Resory
地址:/p/21db20189c40序最近在作者:JanzTam
地址:/p/ede1a、U让学习iOS开发更简单!大众创业 万众创新
努力一阵子 幸福一辈子
来吧!如果你有一颗创业的心,是一位有激情的人,而且满足合伙人的条件,欢迎加入“刚刚在线工作室”!作者:兴宇是谁
地址:/p/1ae78a9379d4iOS中bl我曾经跟朋友开玩笑说,这个时代,有两种人的妻子应该要受人尊敬,第一种是军嫂,这是毫无争议的,第二种就是像我这虽然 Go 并不是一门新语言,不过最近两年来 Go 还是增加了很多有趣的特性,而且使用这门语言的知名项目的数我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使问这个问题的人都该打,先拖出去,赏一丈红~如果你是计算机学生或者意欲从事IT行业的人,那么再仗50大板!!为作者:Sindri的小巢
地址:/p/d0c7d9040c93作者:J_雨
地址:/p/5bb91ccc07e3侧滑删除是iO作者:Azen
地址:/p/a嗨大家,好久无论你是刚开始接触软件项目开发的新手程序员,还是一个正在寻找拓展技能的经验级软件工程师,都有许多学不完的新技随着Android、iOS以及Windows Phone等一系列移动操作系统的不断兴起,移动应用开发也逐渐成几个星期前,当我收到一个自称Someone712的人发给我的一条消息时,我决定要写一篇如何用编程赚钱的博客文作者:暮落晨曦
地址:/p/ce9bAFNetw作者:Liwjing
地址:/users/8df89a9d838我在谋杀自己的职业生涯。没错,很多人都这样说我。我的同事刚刚得知我即将离开公司的消息时,大多数表示理解。但让作者:Liwjing
地址:/users/8df89a9d838随着Android、iOS以及Windows Phone等一系列移动操作系统的不断兴起,移动应用开发也逐渐成你再优秀,也需要一个适合自己的舞台展示!程序员成为技术大牛前,是需要在实践中磨练的,所以面试就是你不得不过的估计你们都看过这个好像是段子的新闻了。为什么题目里的算法是错的?这是好问题。5 x 3 = 5 + 5 +根据胡润百富的数据显示,中国财富100强前10名中,有5名富豪来自科技圈,并且他们的财富占据了前10的一半以四个月前,我从一所代码学校毕业,这所烂学校只教了我Ruby和Ruby on Rails的基本知识。一个星期后作者:一不
来自:/p/556ba33fa498之前发了一篇关于作者:暮落晨曦
地址:/p/ce9bAFNetw据报道,Linux 开机管理程序 Grub 2 出现一项认证旁路(Authentication Bypa作者:Azen
地址:/p/a嗨大家,好久“一觉醒来,发现 Apple Pay 要进入中国了”,这是很多果粉在前几天的感受。按照苹果和中国银联的官方新近日有媒体曝光了Twitter CEO杰克·多西的一些生活习惯,例如他最爱读的书是《道德经》,每天早上五点就来自戴伟来的投稿
地址:http://daiweilai.github.io//Swif每年毕业这么多大学生,很多被培训机构弄去培训了,但是更多的还是选择在大学期间,自力更生去自学,自学的人很多都作者:shelin
原文:/p/aefacc2cf039这段时间TIOBE 2015年12月编程语言发布了,毫无疑问,Java将成为2015年的年度语言。在Top10榜单中IT时代已经开启。下面就是2016年需求最高的这10项技术。这是IT从业者的辉煌时代。IT行业的失业率正处在iOSDevTip最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!热门文章最新文章iOSDevTip最新iOS、iPhone资讯,万名iOS开发者、swift开发、果粉聚集,参与技术讨论,整理开发技巧,分享创业经验!享受生活、热爱编程!}

我要回帖

更多关于 5sing缓存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信