iOS 问题总结
来源:互联网 发布:php curl post 数据流 编辑:程序博客网 时间:2024/05/16 14:31
因为实习原因很久不更新了... 很多东西经常不记也就忘记了,下次再需要的时候还得继续google之, 于是把最近遇到的一些问题记录下来.
开始实习以后,ruby 学了一半开始搞php,php学了一半开始搞android,现在又开始ios
什么都学了一点,了解一点,但是不深... 这是个较大的问题
算,这说明我学习能力还不错...
言归正传,还是总结ios 吧
__________________________________________
刚开始接触ios, 主要要从以下几个部分入手, 弄清楚一下几个部分也就能写出一个较容易的APP了:
1. UI 界面 设计
2. 数据存储
3. 网络连接
1.UI 界面设计
ios 的页面 主要有两种实现方式 xib 和 storyboard (故事版).
storyboard, 顾名思义, 他将很多个xib 整合在一起, 你可以看到一个全局的界面, 并了解不同页面之间是如何跳转和关联的
缺点是不支持ios5.0一下, 并且当你的app 页面较多且复杂时不太适合, 可以考虑storyboard 和 xib 结合的方式
xib, 了解android 开发的人可以把它看成是一个layout, 而 android 中的 acitivity 则对应于ios 中的 viewcontroller
android 中一个acitivity 对应一个 layout, ios 中 一个viewcontroller 对应一个 xib
ios 中不像 android 中提供了 不同的布局方式, 简单的布局只需要将控件拖动到xib上即可.
控件的监听事件只需要拖动并关联即可.
常用的方式主要有 navigationController 和 tabbarController, 可以相互嵌套并嵌套多个,类似设计模式中的装饰模式.
需要注意的一个点是navigationController 维护的是一个 栈 , 只能通过push pop 的方式将操作viewcontroller 跳转到下一个页面
或者通过 presentModalViewController 跳转到下一个页面
view controller 的生命周期
如图所示, 当 viewDidLoad 只会在创建该页面时调用一次, viewWillAppear 和 viewDidAppear 则会在每次该页面出现时调用
可以看成 android 中的 onCreate 和 onResume
2. 数据存储
ios 文件系统中,每个App都有一个独立的home 目录, 目录结构如下
/Appname.app 包含app本身,内含app的所有资源以及可执行文件, app 不允许修改此目录下的文件.
/Documents 关键数据和app数据,比如plist 和 sqlite 文件
/Library 存放非用户数据
/tmp 存放不需要在app每次启动都保持的数据,临时文件. 系统可以删除其中的内容以释放空间
我主要用到的存储方式有两种 : 1. key -value 存plist 文件 2. core data 对sqlite3的一层封装, 保存结构化的数据
3.网络连接
网络连接主要用到了开源的 AFNetworking, 在demo 中可以了解最近基本的网络连接方法。
这里主要介绍一下如何进行https 的访问 和 timeout 延时设置
AFNetworking 的 https: (默认信任所有)
创建类 XXXOperation 继承于 AFHttpRequestOperation, 实现如下方法即可:
- (id)initWithRequest:(NSURLRequest *)urlRequest{ [self setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace) { return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; }]; [self setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) { [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; }]; return [super initWithRequest:urlRequest];}
通常我们通过setTimeOut 方法设置超时时间,但在ios中, 即使你修改了该值, timeout 最小为240s.
有两种解决方案:
1 修改 访问方式为 GET, 即可成功修改timeout值
2.新建计时器当操作延时后, cancel 掉该操作,具体实现如下:
#pragma mark -#pragma mark override, timeout+ (void)setDefaultTimeOutInterval:(NSTimeInterval)timeout { DebugLog(@"defaultTimeoutInterval set to:%f", timeout); defaultTimeoutInterval = timeout;}- (NSTimeInterval)timeoutInterval { if (timeoutInterval > 0) { return timeoutInterval; } return defaultTimeoutInterval;}- (void)start { NSTimeInterval timeout = self.timeoutInterval; if (timeout > 0) { timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(timeout:) userInfo:nil repeats:NO]; } [super start];}- (void)timeout:(id)sender { if (![self isFinished] && ![self isCancelled]) { cancalledBecauseOfTimeout = YES; [self cancel]; } [timeoutTimer invalidate]; timeoutTimer = nil;}
同时, 新增接口, setCompletionBlock, 增加 cancel 的处理段(由于原来的代码已经成型, 不想做太多改动增加工作量, 只好想出这么个恶心的办法了, 还算好用)
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure cancel:(void (^)(AFHTTPRequestOperation *, NSError *))cancel{ self.completionBlock = ^{ if ([self isCancelled]) { dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ cancel(self, self.error); }); } else if (self.error) { if (failure) { dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } } else { if (success) { dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ success(self, self.responseData); }); } } };}暂时就这么多, 还有问题以后继续补充
- iOS 部分问题总结
- iOS 问题总结
- IOS面试问题总结
- iOS小问题总结
- IOS面试问题总结
- iOS 遇到问题总结
- IOS面试问题总结
- iOS RATreeView 问题总结
- IOS面试问题总结
- iOS面试问题总结
- IOS面试问题总结
- IOS面试问题总结
- ios面试问题总结
- iOS问题总结
- iOS开发问题总结
- iOS开发问题总结
- IOS SVN问题总结
- iOS奇葩问题总结
- Linux系统安装出错后出现grub rescue的修复方法
- Android检测系统版本号
- shape定义控件
- 最大值最小化
- ASP.NET IsPostBack属性剖析
- iOS 问题总结
- linux查找文件内容grep
- WDK编译libwdi
- 与“零值”的比较
- 如何批量清除128组节点db上面的过期的binlog,释放磁盘空间。
- JSON格式编码操作类
- android防止APK被反编译的方法
- cloc统计WebKit的代码量
- java主函数