原文链接

本周我们启动主题收集,如果你有想了解的 iOS 技术方面的主题,请在我们的 github https://github.com/awesome-tips/iOS-Tips/ 提 issue,也可以在相关的 issue 推荐文章。我们后期会每周整理一个主题。

另外,我们的小程序 猿小荐 正式发布,我们希望为大家提供一个良好的职位发布和查看工具,后期也会不断加入其它功能,欢迎大家试用。我们在后面的每篇文章中,也会加入一个职位推荐。

上周公众号发布的以下文章:

  • iOS 倒计时的探究与选择
  • 构建一个 @synchronized
  • CSPopKit 弹窗框架的设计实现
  • 内推的一些想法

本期知识小集的主要内容包括:

  • 一入IAP深似海
  • iOS 金额字符串格式化显示的方法
  • 几个第三方框架关于线程锁的封装小技巧

一入IAP深似海

作者: 高老师很忙

在做 IAP 的时候,我们通常会给 SKMutablePayment 对象的 applicationUsername 传入一个值,比如说用户ID的哈希值,等交易成功后,通过 transaction.payment.applicationUsername 与之前传入的值进行对比校验。

最近发现,交易成功回调返回的 transaction.payment.applicationUsername 有可能返回空,并且测试阶段很难发现。解决办法就是增加异常处理逻辑,当 transaction.payment.applicationUsername 返回空的时候,要加入一些业务相关的逻辑判断。例如,你的 applicationUsername 传入的是用户ID相关的信息,当 transaction.payment.applicationUsername 返回为空的时候,就要增加判断发生购买行为和收到回调时是否是同一个用户的逻辑,或者根据你具体的业务而定补充逻辑。

iOS 金额字符串格式化显示的方法

作者: KANGZUBIN

在一些金融类的 App 中,对于表示金额类的字符串,通常需要进行格式化后再显示出来。例如:

  • 0 --> 0.00
  • 123 --> 123.00
  • 123.456 --> 123.46
  • 102000 --> 102,000.00
  • 10204500 --> 10,204,500.00

它的规则如下:

个位数起每隔三位数字添加一个逗号,同时保留两位小数,也称为“千分位格式”。

我们一开始采取了一种比较笨拙的处理方式如下:

首先根据小数点 . 将传入的字符串分割为两部分,整数部分和小数部分(如果没有小数点,则补 .00,如果有多个小数点则报金额格式错误)。对于小数部分,只取前两位;然后对整数部分字符串进行遍历,从右到左,每三位数前插入一个逗号 ,,最后再把两部分拼接起来,代码大致如下:

- (NSString *)moneyFormat:(NSString *)money {if (!money || money.length == 0) {return money;}BOOL hasPoint = NO;if ([money rangeOfString:@"."].length > 0) {hasPoint = YES;}NSMutableString *pointMoney = [NSMutableString stringWithString:money];if (hasPoint == NO) {[pointMoney appendString:@".00"];}NSArray *moneys = [pointMoney componentsSeparatedByString:@"."];if (moneys.count > 2) {return pointMoney;} else if (moneys.count == 1) {return [NSString stringWithFormat:@"%@.00", moneys[0]];} else {// 整数部分每隔 3 位插入一个逗号NSString *frontMoney = [self stringFormatToThreeBit:moneys[0]];if ([frontMoney isEqualToString:@""]) {frontMoney = @"0";}// 拼接整数和小数两部分NSString *backMoney = moneys[1];if ([backMoney length] == 1) {return [NSString stringWithFormat:@"%@.%@0", frontMoney, backMoney];} else if ([backMoney length] > 2) {return [NSString stringWithFormat:@"%@.%@", frontMoney, [backMoney substringToIndex:2]];} else {return [NSString stringWithFormat:@"%@.%@", frontMoney, backMoney];}}
}
复制代码

其中,stringFormatToThreeBit: 方法的实现如下:

- (NSString *)stringFormatToThreeBit:(NSString *)string {NSString *tempString = [string stringByReplacingOccurrencesOfString:@"," withString:@""];NSMutableString *mutableString = [NSMutableString stringWithString:tempString];NSInteger n = 2;for (NSInteger i = tempString.length - 3; i > 0; i--) {n++;if (n == 3) {[mutableString insertString:@"," atIndex:i];n = 0;}}return mutableString;
}
复制代码

上述实现看起来非常繁琐。

其实,苹果提供了 NSNumberFormatter 用来处理 NSStringNSNumber 之间的转化,可以满足基本的数字形式的格式化。我们通过设置 NSNumberFormatternumberStylepositiveFormat 属性,即可实现上述功能,非常简洁,代码如下:

- (NSString *)formatDecimalNumber:(NSString *)string {if (!string || string.length == 0) {return string;}NSNumber *number = @([string doubleValue]);NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];formatter.numberStyle = kCFNumberFormatterDecimalStyle;formatter.positiveFormat = @"###,##0.00";NSString *amountString = [formatter stringFromNumber:number];return amountString;
}
复制代码

关于 NSNumberFormatter 更详细的用法,可以参考这篇文章的介绍:NSNumberFormatter 介绍和用法

几个第三方框架关于线程锁的封装小技巧

作者: 陈满iOS

启示

第三方库中经常用到的这个小技巧,例如 YYCacheSDWebImage 等等,虽然各自封装的具体形式不太一样。

  • YYCache
  • SDWebImage
  • YYWebImage

我们可以借鉴到自己的项目中,在适当的位置通过宏来加锁解锁操作。

使用

1. YYCache 版本的宏封装

#define Lock() dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER)
#define Unlock() dispatch_semaphore_signal(self->_lock)
复制代码
  • 操作数据之前,先外面进行加锁解锁
- (NSInteger)totalCount {Lock();int count = [_kv getItemsCount];Unlock();return count;
}
复制代码
  • 锁里面再进行真正的数据操作
- (int)getItemsCount {return [self _dbGetTotalItemCount];
}
复制代码

2. SDWebImage版本的宏封装

  • 定义
#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
#define UNLOCK(lock) dispatch_semaphore_signal(lock);
复制代码
  • 调用示例
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field {LOCK(self.headersLock);if (value) {self.HTTPHeaders[field] = value;} else {[self.HTTPHeaders removeObjectForKey:field];}UNLOCK(self.headersLock);
}
复制代码

其中,self.headersLock 的定义为:

@property (strong, nonatomic, nonnull) dispatch_semaphore_t headersLock;
复制代码

3. YYWebImage版本的宏封装

相对于上面,还有更方便的宏封装,把解锁操作跟加锁封装在一块。

  • 宏定义
#define LOCK(...) dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(self->_lock);#define LOCK_VIEW(...) dispatch_semaphore_wait(view->_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(view->_lock);
复制代码
  • 使用示例
- (void)didReceiveMemoryWarning:(NSNotification *)notification {[_requestQueue cancelAllOperations];[_requestQueue addOperationWithBlock: ^{_incrBufferCount = -60 - (int)(arc4random() % 120); // about 1~3 seconds to grow back..NSNumber *next = @((_curIndex + 1) % _totalFrameCount);LOCK(NSArray * keys = _buffer.allKeys;for (NSNumber * key in keys) {if (![key isEqualToNumber:next]) { // keep the next frame for smoothly animation[_buffer removeObjectForKey:key];}})//LOCK}];
}
复制代码

关注我们

欢迎关注我们的公众号:iOS-Tips,也欢迎加入我们的群组讨论问题。可以公众号留言 iosflutterwebpwa小程序 等关键词获取入群方式。

「 iOS知识小集 」2018 · 第 29 期相关推荐

  1. 「 iOS 知识小集 」2018 · 第 23 期

    上周公众号发布的以下文章: 美团客户端响应式框架 EasyReact 开源 巧妙利用 KVO 实现精准的 VC 耗时检测 微信小程序适配 iPhone X 总结 Shortcuts, Siri 功能增 ...

  2. 「 iOS知识小集 」2018 · 第 38 期

    原文链接 更新:前两周我们发了一条小集<Xcode 10.1 并没有修复由于 Assets 引起的在 iOS 9 上的崩溃问题>,根据最新消息,苹果已经在服务器端解决了这个问题,开发者通过 ...

  3. 「 iOS知识小集 」2018 · 第 35 期

    原文链接 上周公众号发布的以下文章: Flutter中Hybrid的实现 不改代码,Link-Time Optimization提高iOS代码效率 + 汇编代码原理分析 关于 Block 的几点思考 ...

  4. 「 iOS 知识小集 」2018 · 第 24 期

    上周公众号发布的以下文章: iOS 图形处理概论 再谈 __bridge, __bridge_transfer, __bridge_retained(内有彩蛋) Flutter 的编译模式 这些流行编 ...

  5. 「医疗知识图谱」到「综合性医疗大脑」

    本文首发于个人博客:www.bobinsun.cn 背景 最近,由于某些原因,特别关注了医疗知识图谱方面的发展&应用情况,有了些浅薄认识,故码此文,以供参考. 随着智能时代的到来,把临床数据. ...

  6. 一个barcode 多个 sku号_「小白知识帖」什么是亚马逊SKU?编写SKU还有这些讲究……...

    初入亚马逊的小白卖家常会听大佬们提到SKU.其实理解SKU和其作用很简单,但真正需要掌握的是如何编写有效的SKU.这些小细节的内容往往可以让小白卖家成长的更快. 什么是SKU? SKU(Stock K ...

  7. iOS知识小集·NSNumber to NSString出错啦

    起因 某一次准备把一个NSNumber显示在lable上. NSString *text = [NSString stringWithFormat:@"%@",value]; 复制 ...

  8. 专题解读 |「知识图谱」领域近期值得读的 6 篇顶会论文

    本期内容选编自微信公众号「开放知识图谱」. CIKM 2017 ■ 论文 | Hike: A Hybrid Human-Machine Method for Entity Alignmentin La ...

  9. 知识小集 2018 下半年文章汇总及年终总结

    又到岁末,又到了写总结,写愿景的时候.这里,我就来简单写写小集这一年的总结和下一年的展望吧. 总结 先简单列一下我们今年的产出: 公众号从 3月2号 开始,总共发了 42 期小集合集,以及 130+ ...

最新文章

  1. MYsql优化where子句
  2. AJAX——注册新用户的重名提示
  3. 选择指定的MySQL数据库
  4. YYDS!对比学习还能这么用?
  5. zblock 结构_偷窥Data block 的物理结构
  6. android让图片旋转动画,利用RotateAnimation旋转图片的问题 - 移动平台 / Android
  7. leetcode Best Time to Buy and Sell Stock专题
  8. 数据增强操作(旋转、翻转、裁剪、色彩变化、高斯噪声等)
  9. 100个Java实战项目视频+代码+笔记
  10. 部署VC2008的程序
  11. C#反编译工具:ILSpy
  12. VGG16网络,VGG19
  13. js编写五种基础排序(冒泡排序、选择排序、插入排序、快速排序、sort)
  14. 使用opengl es编写2d游戏的一些说明和技巧
  15. 【转载】ABAP CDS 函数
  16. vba遍历字符串_Notes-VBA-遍历
  17. SCI期刊Cover Letter写法模板
  18. 微前端——single-spa源码学习
  19. [转] 程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
  20. 使用腾讯文档收集快递信息

热门文章

  1. 描写油菜花的好句好段
  2. java中laber字体颜色设置,QLabel:设置文本和背景的颜色
  3. ONF组织的SDN架构文档——四个架构(三/一)
  4. 《利用Python进行数据分析》第七章——数据清洗与准备
  5. Python实现将一张图片切成9宫格
  6. 一个简单的文本编辑器。(是在DEV C++下写的)
  7. 【实例】VBA excel 隔行插入行与列
  8. 计算机网络:学习笔记(持续更新)
  9. excel批量将数字转为文本格式
  10. 滴滴:WebApp实践经验总结