搜狐技术产品

其他

初始mach-o文件及在项目中应用

本文字数:2250字预计阅读时间:15分钟01认识mach-o的必要性了解mach-o的结构可以帮助认识系统加载二进制文件的动态链接和静态链接。应用层面,使用initialize的c++函数计算启动时间耗时也需要以mach-o的结构知识为铺垫。还可以用在使用clang自注册启动任务上。后续会一一展开说明。02mach-o的定义mach-o是mach
2月1日 上午 7:30
其他

短信过滤 APP 开发

backuphttps://apple.stackexchange.com/questions/300866/sql-to-extract-messages-from-backup)Creating
2023年9月7日
其他

CADisplayLink前世今生

review的时候说到了CADisplayLink的一些变化,感触颇深,提到了接口的一些变动,现在就自己的一些理解加上网上文档的查阅对该对象进行以下的说明:测试环境编译环境:Xcode
2023年6月15日
其他

CreateML使用

背景业务需求,想要通过拍照识别照片中指定物体的数量或者物体的种类。而这种物体的模型网上没有训练好的,需要从头开始。所以调研了苹果的createML的实现方案,具体操作如下:需求是:通过拍照识别照片中指定物体的数量,实现方案大致有几种:通过第三方平台,训练数据,生成模型,提供前端使用自己搭建平台,训练数据,生成模型,提供前端使用通过苹果的CreateML工具,训练数据,生成模型,供iOS使用或转换成其他模型使用对比可以发现,通过苹果的CreateML工具,可以省去搭建平台的过程。下面来看看怎么使用CreateML。使用CreateML的整体流程是:有大量的样本标注所有的样本用这些样本训练生成模型验证模型的识别率测试模型效果导出模型供使用需求是通过拍照识别照片中指定物体的数量,所以对我来说样本就是照片,下面就来看下怎么生成CreateML训练需求的标注信息。使用样本照片标注首先要有大量的样本照片,这里由于是调研测试,所以选取20张照片,照片来源是百度图片。。。麻烦的是照片标注,由于苹果CreateML训练需要指定格式的JSON文件,格式如下:[
2023年3月23日
其他

iOS APP添加桌面快捷方式

Scheme。方法二:H5提供通用的网页,客户端替换通用网页中的内容,比如标题、图标等,并转为DataURI格式,服务端提供接口URL,客户端配置打开URL
2022年12月15日
其他

基于Sentinel的亿级网关流量复制方案

API分组匹配成功,进行请求属性的解析,并且将customizedRuleList::add函数追加到参数末尾,以便传递入Sentinel处理槽链中GatewayFlowSlot槽的处理逻辑中
2022年11月10日
其他

Swift Package Manager工程实践

Manager随着时间推移也在不断迭代,所以需要注意swift-tools-version中指定的版本号,有些功能在高版本与低版本内部实现有差别,某些新功能在高版本才能使用;//
2022年11月3日
其他

SPI原理以及SPI在Android中的实战

不适合小型项目,因为会多出来很多的module,同时项目架构比较复杂,无疑增加了代码阅读的难度(2):遍历加载所有的实现类,效率还是相对较低的(初次启动的时候,加载过以后缓存起来);(3):当多个
2022年9月22日
其他

响应式异步非阻塞编程在服务端的应用

本文字数:13229字预计阅读时间:34分钟1、前言对于服务端的开发者而言,我们总有一个共同的目标,那就是如何用更少的资源获得足够的性能来支持我们的服务!,我们不是在性能优化中,就是在性能优化的路上。作为Javaer我们,服务性能优化的武器库中,异步和并发是永远不会过时的两个。然而理想很美好,现实很骨感:异步编程的思维方式同大脑的命令式思维是背道而驰的。在Java的世界中,直到目前Jdk17,也没有async/await来帮我们解决回调地狱的问题,强行大量异步,将深陷回调地狱而不能解脱...并发调用方面,大量编排异步线程任务,不仅会造成资源的快速消耗,也会导致业务流程的实现难以理解,正所谓:写这段代码时能理解它的只有我和God,一个月后能理解它的就只有God了...。在服务端引入响应式编程,是解决如上问题的一个好的思路。下面,我以搜狐视频服务端PUGC团队在PUGC视频对象创建接口的重构工作的实践为背景,介绍响应式(基于RxJava)异步非阻塞编程在服务端的应用在服务端的应用。2、问题概述PUGC视频对象创建接口,从业务角度看:用于为用户上传视频数据前在服务端为其分配一个视频对象记录,该视频对象记录被用于描述当前视频的完整生命周期,从技术角度看:它是一个聚合接口,通过组合多个上游接口数据,主业务过程涉及:帐号、内容审核、视频对象存储、转码、CDN调度等,实现业务过程。该接口代码年代久远,从提交记录中可查到的最早的历史在2013年,随着业务的变化,开发人员的变更,代码中充斥着各种各样的味道。不论是从业务角度、性能角度亦或是日常维护角度看,都难以满足需要。业务流处理过程逻辑冗长,逻辑复杂,可读性差,难于维护。并发任务较多,但缺少合理的编排措施,是否需要异步或并发控制完全随意。几乎没有正确的异常处理。充满Ctrl+C/V的味道......为了解决以上的诸多问题,我们开始了重构(重写)之路。3、读懂业务流重构的原则是保证接口实现的业务规则的一致性,通过仔细研读代码,整理出接口中实现的诸多特性和业务规则。视频对象创建主流程如下图所示:
2022年9月15日
其他

通过抓包深入分析HTTPS

通讯密文都会被破解,即这种算法不支持“前向加密”。想要详细了解RSA密钥交换算法的原理,可以看文章:https://mp.weixin.qq.com/s/U9SRLE7jZTB6lUZ6c8gTKg
2022年9月8日
其他

你真的懂iOS的异常捕获吗?

本文字数:18591字预计阅读时间:47分钟在开发的日常中,经常会遇到一些极其偶现的Bug,有些Bug很难以复现,所以一般的解决方案是接入PLCrashReporter这些第三方的崩溃统计工具,从保存的崩溃文件中读取相应的崩溃信息。那么这些崩溃统计工具又是基于什么原理运作的呢?我对此产生了很大的兴趣,所以对此做了一些调研,以下是我的成果:Task
2022年9月8日
其他

响应式编程(Reactive Programming)初探

});Filter(https://reactivex.io/documentation/operators/filter.html)--1--2--3----|->[
2022年8月25日
其他

Android网络请求优化及离线上传封装

本文字数:11171字预计阅读时间:28分钟前言在android开发中,无论是去解决网络请求中遇到的问题,还是优化网络请求的效率,都离不开最根本的网络传输协议(http和tcp等),所以本文的第一部分是对网络协议相关的基础知识进行讲解。掌握了必备的基础知识之后,接下来的第二部分,会对android中使用最广泛的网络请求框架okhttp进行分析,这款框架不仅对基础的网络请求逻辑进行了封装,还尽善尽美的替我们做好了几乎每一件可以去优化的事情,如果能很好的理解并使用它,我相信大部分网络请求相关的问题都可以很好的得到解决。本文的最后部分,想说一说我是如何使用kotlin反射对离线数据上传进行封装的。网络传输协议网络传输协议大概分为4层(图片来自于极客教程):(图1)即链路层、网络层、传输层、应用层。其中,链路层协议是用来在各个物理节点(主机、交换机、路由器)之间传输的协议,会把网络层的ip数据包和mac地址封装成帧,通过mac地址来定位传输以帧为单位的数据。网络层协议是通过ip地址进行路由选择。这两层的协议基本上不用我们操心,我们主要来看一下传输层和应用层协议。TCP和UDP协议TCP和UDP都是传输层协议,不关心数据的格式,只负责传输,把上层的数据分割成一段一段的去传输。TCP协议是可靠的,有连接的,顺序发送数据,顺序接收(收到数据之后会确认,得到确认之后才会继续发送)。UPD是不可靠的,无连接的,顺序发送数据,乱序接收(不需要确认,不关心有没有收到)。TCP如何实现可靠传输TCP传输的每一段数据都会被装在一个TCP头里,头的内容包括接收方端口号、序列号、标志位、确认码。三次握手:TCP需要经过三次握手创建连接:
2022年8月18日
自由知乎 自由微博
其他

Jetpack Compose自定义Layout详解

Constraints)方法进行测量并得到一个新的可放置的布局Placeable。所有子元素测量完成后,在根据得到的测量结果进行具体的放置工作,用代码体现出来如下:@Composablefun
2022年8月11日
其他

try catch finally机制分析

指向的字节码;如果不匹配则继续遍历异常表如果遍历完所有的异常表,还未匹配到异常处理器,那么该异常将抛出到调用方(caller)中重复上述的操作。最坏的情况下虚拟机需要遍历该线程
2022年8月4日
其他

记一次日志引起的服务端问题排查经历

本文字数:7655字预计阅读时间:20分钟1、源起:一天中午休息饭后散步时,隔壁组的王老哥提到,他们组的负责的一个Java服务最近一段时间,每天0点,经常会收到网关报警:提示接口响应慢。老板天天追问,但是服务使用的spring组件虽然支持在tomcat线程使用率超过一定数值后自动生成现场快照,但是不知道是什么原因,查看相关时间点附近生成的快照文件,里面的内容均正常,日志内容除问题时间点缺了一些之外,也没有异常现象,所以对于该问题,他是:老虎吃天,无从下爪。我一听,瞬间来了精神:“老王啊老王,你也有今天。。。”,老王:“来来来,你接力!!!搞定请你吃饭。”看在吃饭的份上,我答应了。于是有了如下的问题排查过程。2、问题定位过程:既然抓不到现场的快照,没有直接的线索,就只能先收集一些有用的线索。2.1
2022年7月21日
其他

探秘AutoreleasePool实现原理

本文字数:10673字预计阅读时间:27分钟使用使用场景在ARC下,AutoreleasePool主要应用在大量创建临时对象的场景,通过AutoreleasePool控制内存峰值,是一个很好的选择。NSAutoreleasePool在MRC可以调用NSAutoreleasePool使对象延迟释放,在ARC下这个API已经被禁用。NSAutoreleasePool
2022年5月26日
其他

视频下载加速,2.5倍优化

本文字数:4723字预计阅读时间:12分钟视频下载加速,2.5倍优化目录背景方案设计测试数据代码实现收益背景视频缓存已经成为各大视频App的标配,并且从功能使用数据来看,每个月使用的量都很大。所以,做好缓存功能的优化,对提升用户体验有非常重要的作用。搜狐视频iOS端的缓存和爱奇艺的有区别,并没有多个视频同时缓存的产品功能,而且缓存分片是串行下载的。即m3u8文件缓存下来后,顺序下载ts地址对应的文件,导致网络利用率不高。为了提升用户体验,提升缓存速度,我对缓存进行了速度优化,提升了网络利用率。具体方案如下。方案设计分析缓存方案的核心在于,最大程度的提升网络利用率。但并非单纯的扩大并发缓存数量,这样会导致设备发烫、网络资源抢夺等很多问题。应该根据网速和设备性能等因素,动态决定分片数量。所以,设计一套合理的测速方案,以及缓存方案就非常重要。由于我们的网络使用的quic协议,所以在网络层面已经没有太大的提升空间,只能通过上层进行优化。缓存方案如果是新建的缓存任务,没有测速数据或数据已过时。数据已过时指的是两次缓存不是连续的,例如暂停后再继续缓存,或重启后缓存。则根据网络环境做判断,来决定并行下载数量。流量环境并行数量为2,WiFi并行数量为4。这个值是测试的一个经验值。并发数量并不是固定的,从第一次下载开始,每次缓存的过程都会进行测速,并根据测速结果动态修改并发数量,并且持续利用缓存的速度数据进行测速,来修改并发数量。当网络环境发生改变后,这时候需要重新进行测速,从第一步重新开始。在网络的部分,底层quic使用的cronet库作为实现。cronet没有长连接的概念,是通过cronet线程处理的并发,同一端口最多6条线程,最多不超过16条线程。所以,需要上层逻辑控制并发数,并不能直接设置并发数。由于项目中大多数的视频都是m3u8格式,缓存加速只对m3u8的视频缓存做了加速,drm和mp4格式的视频并没做处理。而且,drm和mp4目前是流式下载,如果想加速需要后端对视频文件做切片。测速方案测速需要考虑下面几个核心因素。网络环境,WiFi和流量的平均网速相差比较大,WiFi下可以更充分的利用网络资源。网速,最核心的因素,网速慢的话,什么方案都没用。设备性能,同样的网速,在不同设备上表现可能不一样。低版本设备并发数太多,可能会导致卡顿或发热严重。视频类型,电影单个剧集ts数量较多,缓存时间长且连贯,所以可以适当增加并发数。并发数需要控制在一个合理的区间,如果下载并发数太多,会造成请求拥堵,从而触发timeout。如果下载并发数过少,会导致网络利用率不高。并且,不只要考虑缓存部分,还需要考虑是否会抢夺其他请求的资源。否则会导致其他非缓存的请求,由于缓存占用带宽过多,导致请求变慢或大量触发timeout。测速方案经过实践验证,根据上述因素设置不同的权值。在考虑因素的过程中,还需要防止手机发烫的问题,所以需要多次测试才能决定权值。方案的核心在于,最大限度的利用用户的带宽,以及设备性能,并且和发热保持一个良好的平衡。温度适中,并且不会影响fps。下图是整个缓存方案的一个流程图,看图比较直观。测试数据测试方法由于还未上线,所以数据来源于控制台日志,但经过多次以及不同网络环境下的测试。缓存类型为电影和电视剧,表格中前两列为电影,后两列为电视剧。测试方法,在同一时间缓存同一剧集,相同清晰度,对比线上版本和缓存加速版本的差别,分别测试WiFi和流量环境。在测试阶段,设备始终在前台。从数据来看,电影由于文件比较大,在网速快的情况下提升比较明显。电视剧由于网速刚上来就下载完了,数据没有这么明显,但也有50%左右的提升。同时对下半年缓存数据进行了下统计分析,流量环境下的缓存的只占二十分之一左右,可以看出WiFi环境下是占绝大多数的。所以,WiFi环境下加速,可以更好的让用户享受到缓存加速带来的优化体验。鉴于使用缓存功能的用户,大多数都是在WiFi环境下使用,所以主要还是以WiFi的数据为准。WiFi环境分别测试了公司WiFi,和我家里的WiFi,可以代表很多WiFi网络环境了。下面是不同网络环境下,多次测试的平均结果。WiFi经过多次测试,平均提速为2.35倍。流量经过多次测试,平均提速为1.50倍。播放流畅性为了防止缓存抢夺过多网络资源,从而影响播放的流畅性,对WiFi和流量环境下,缓存电视剧和电影进行了测试。测试结果表明,不同网络环境下缓存电视剧和电影,不会对播放流畅性造成影响,播放视频始终在60的fps。代码实现下面是实现的核心逻辑的伪代码,主要为了体现测速的代码流程。///
2022年4月21日
其他

子线程更新UI全解

ViewRootImpl#scheduleTraversals(),但是却没有调用ViewRootImpl#checkThread()。所以我们得到了一个结论:在硬件加速的情况下只调用
2022年4月7日
其他

适配到Android 12,全版本支持保存图片到相册方案

本文作者作者:de得得de链接:https://juejin.cn/post/7042218651482587172本文由作者授权发布。1背景由于Google对用户隐私和系统安全做得越来越完善,应用对一些敏感信息的操作越来越难。比如最常见的共享存储空间的访问,像保存图片到相册这种常见的需求。•
2022年3月17日
其他

Docker 大势已去,Podman 即将崛起!

signatures0492e405b9ecb05e6e6be1fec0ac1a8b6ba3ff949df259b45146037b5f355035//查看镜像[root@localhost
2022年3月17日
其他

探秘OC消息发送机制

本文字数:19318字预计阅读时间:49分钟探秘OC消息发送机制整体分析runtime的消息机制总体可以被分为三部分,也会被拆分为四步或者其他拆分法,总之流程对就行。消息发送:刚调用objc_msgSend函数后,内部的一些处理逻辑。会涉及到cache
2022年3月17日
其他

写个App 启动任务框架,有多难?

ContentProvider。小结通过层层拆解,将复杂的依赖梳理清楚,用通俗易懂的方法,实现任务调度。源码https://github.com/wangchenyan/init另外,我也在
2022年3月3日
其他

小剧场|据说这是情人节最好的礼物……

#春招正在启动“浪漫”来袭~来看看HR小姐姐在情人节收到了什么?让人心花怒放😍(其实小编看的也馋了……)扫码关注视频号👇后续解锁更多
2022年2月17日
其他

Flutter状态管理-Provider的使用和源码解析

本文字数:22690字预计阅读时间:57分钟Flutter状态管理-Provider的使用和源码解析前言在各种前端开发中,由于状态管理对于App的开发维护成本,性能等方面都起着至关重要的作用,所以选择合适的状态管理框架显得尤为重要。Flutter作为跨平台框架的后起之秀,背靠Google大树,短时间内开发者们在开源社区提供了多种状态管理框架。而Provider是官方推荐的状态管理方式之一,可用作跨组件的数据共享。本文将针对Provider框架的使用及实现原理作详细的说明,并在最后对主流的状态管理框架进行比较。使用Provider的使用非常简单,通常使用ChangeNotifierProvider配合ChangeNotifier一起使用来实现状态的管理与Widget的更新。其中ChangeNotifier是系统提供的,用来负责数据的变化通知。ChangeNotifierProvider本质上其实就是Widget,它作为父节点Widget,可将数据共享给其所有子节点Widget使用或更新。具体的原理解析在后续章节会进行说明。所以通常我们只需要三步即可利用Provider来实现状态管理。1.创建混合或继承ChangeNotifier的Model,用来实现数据更新的通知并监听数据的变化。2.创建ChangeNotifierProvider,用来声明Provider,实现跨组建的数据共享。3.接收共享数据。我们来举个例子,看看它是怎么在父子之间进行数据共享的:例1
2022年2月10日
其他

狐教兽|每个人都是自己的后期导演

来跟随本期大咖搜狐财经视频主编——王江老师学习剪辑思路汲取成功案例亲身操作实践每个人都是自己的后期导演🎬扫码关注视频号👇关注
2022年2月10日
其他

Three.js 实现 2022 冬奥主题 3D 趣味页面(内含“冰墩墩”)

模型来计算反射率。这可以很好地模拟一些表面(例如未经处理的木材或石材),但不能模拟具有镜面高光的光泽表面(例如涂漆木材)。构造函数:MeshLambertMaterial(parameters
2022年2月10日
其他

一次遍历导致的崩溃

对抽象工厂设计模式的称呼。使用抽象类初始化返回一个具体的子类的模式的好处就是让调用者只需要知道抽象类开放出来的API的作用,而不需要知道子类的背后复杂的逻辑。验证结论过程的类簇对应关系请看这篇
2022年1月27日
其他

前端工程化-打造企业通用脚手架

本文字数:10930字预计阅读时间:28分钟前端工程化-打造企业通用脚手架目录前言脚手架是什么?脚手架能力为什么不用自动化构建工具脚手架核心价值使用脚手架@focus/cli架构依赖项概览focus
2022年1月13日
其他

源码分析-Kotlin中协程的挂起和恢复

本文字数:12447字预计阅读时间:32分钟源码分析-Kotlin中协程的挂起和恢复前言Kotlin中的协程经过几个版本的升级已经非常成熟了,但是协程的概念目前没有一个明确且被普遍接受的定义。究其根源无论我们怎么去理解协程的概念,它最核心的点就是函数或者一段程序能够被挂起,稍后再挂起的位置恢复。所以在任何场景下探讨协程都能够落脚到挂起和恢复。本文通过源码对协程创建->挂起->恢复流程进行分析解读。希望能够帮助大家对Kotlin协程的理解起到帮助。协程的创建Kotlin中协程是复合协程,是为了方便开发者使用而进一步封装的API,当我们在分析的时候无从下手就是因为经过封装的协程在经过编译后才能看到它的庐山真面目。下面我们通过构造一个简单的协程并反编译成java代码查看。class
2022年1月6日
其他

深入排查 FLAG 导致的 Activity 无法正常启动

ActivityStarter#startActivityInner,所以我们将着重分析这个方法。//com.android.server.wm.ActivityStarterint
2021年12月23日
其他

小小的宏 大大的世界

本文字数6460字预计阅读时间:17分钟小小的宏,大大的世界题记:用最通俗的语言,描述最难懂的技术❝本人是作者在对项目中的宏进行编译层面优化时有感而发的文章,如果有那些论述模糊或者不准确,请联系weiniu@sohu-inc.com目录表关于UIKITEXTERNUIKITEXTERN代码解读原理应用场景扩展宏externstaticconstiOS下的extern参考文档结束语关于UIKITEXTERN
2021年12月9日
其他

Android与HEIF格式图片适配方法

格式文件的后缀有两种:.heif和.heic五. 前景并不是每一部手机都将支持这个功能。不支持的原因是硬件配置与专利许可的限制。要使用该技术,手机厂商需要要先支付一大笔专利费用。
2021年12月2日
其他

SwiftUI的NavigationView的基础讲解与进阶实践

本文字数:3858字预计阅读时间:12分钟前言在UIKit的框架中,我们时常使用UINavigationViewController来管理页面的push和pop。这是页面管理的基本操作。而到了SwiftUI,该操作是交由NavigationView和NavigationLink来完成。本文先从NavigationView的基本应用讲起,再补充如何灵活的使用NavigationView来完成很多更细节化的需求。让我们开始吧。基本概念在以下代码中,我们用一个demo展示了NavigationView和NavigationLink的基本应用。//
2021年11月25日
其他

KVO原理分析介绍

本文字数:5154字预计阅读时间:15分钟KVO原理分析介绍KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO是一对一的,而不一对多的。KVO对被监听对象无侵入性,不需要手动修改其内部代码即可实现监听。KVO可以监听单个属性的变化,也可以监听集合对象的变化。通过KVC的mutableArrayValueForKey:等方法获得代理对象,当代理对象的内部对象发生改变时,会回调KVO监听的方法。集合对象包含NSArray和NSSet。使用使用KVO分为三个步骤通过addObserver:forKeyPath:options:context:方法注册观察者,观察者可以接收keyPath属性的变化事件回调。在观察者中实现observeValueForKeyPath:ofObject:change:context:方法,当keyPath属性发生改变后,KVO会回调这个方法来通知观察者。当观察者不需要监听时,可以调用removeObserver:forKeyPath:方法将KVO移除。需要注意的是,调用removeObserver需要在观察者消失之前,否则会导致Crash。注册在注册观察者时,可以传入options参数,参数是一个枚举类型。如果传入NSKeyValueObservingOptionNew和NSKeyValueObservingOptionOld表示接收新值和旧值,默认为只接收新值。如果想在注册观察者后,立即接收一次回调,则可以加入NSKeyValueObservingOptionInitial枚举。还可以通过方法context传入任意类型的对象,在接收消息回调的代码中可以接收到这个对象,是KVO中的一种传值方式。在调用addObserver方法后,KVO并不会对观察者进行强引用。所以需要注意观察者的生命周期,否则会导致观察者被释放带来的Crash。监听观察者需要实现observeValueForKeyPath:ofObject:change:context:方法,当KVO事件到来时会调用这个方法,如果没有实现会导致Crash。change字典中存放KVO属性相关的值,根据options时传入的枚举来返回。枚举会对应相应key来从字典中取出值,例如有NSKeyValueChangeOldKey字段,存储改变之前的旧值。change中还有NSKeyValueChangeKindKey字段,和NSKeyValueChangeOldKey是平级的关系,来提供本次更改的信息,对应NSKeyValueChange枚举类型的value。例如被观察属性发生改变时,字段为NSKeyValueChangeSetting。如果被观察对象是集合对象,在NSKeyValueChangeKindKey字段中会包含NSKeyValueChangeInsertion、NSKeyValueChangeRemoval、NSKeyValueChangeReplacement的信息,表示集合对象的操作方式。其他触发方法调用KVO属性对象时,不仅可以通过点语法和set语法进行调用,KVO兼容很多种调用方式。//
2021年11月18日
其他

狐友iOS客户端埋点的前世今生

本文字数:4569字预计阅读时间:14分钟零、简介本篇文章将结合狐友iOS客户端埋点的实践,给大家介绍不同的埋点实现方案及一些问题总结。主要包括以下内容:初步认识埋点概念及分类服务端埋点客户端埋点客户端埋点的实现全代码埋点实现无侵入埋点实现一些问题的总结一、认识埋点所谓埋点是数据领域的专业术语,也是互联网应用里面的一个俗称。埋点的学名应该是事件追踪,对应的英文是Event
2021年11月11日
其他

iOS下的闭包上篇-Block

本文字数:2987字预计阅读时间:8分钟Block题记:用最通俗的语言,描述最难懂的技术❝最近在学习和迁移Swift方面的代码,正好看到了闭包这部分,看完之后整个人都被着魔了一样,于是便有了这两篇文章,如果有那些论述模糊或者不准确,请联系weiniu@sohu-inc.com目录表Block是什么Block有什么用语法使用场景原理Block的数据结构及编译过程关于Block的Copy关于Block捕获的变量注意事项参考文档结束语Block是什么Block是Objective-C编程语言下的一个闭包实现,那么什么是闭包?闭包有两个特性,第一某个结构体包含了被引用的局部变量,第二包含了相关的代码块。在Apple在线源文件(https://opensource.apple.com/source/libclosure/libclosure-63/Block_private.h.auto.html)可以找到另外的答案,它的结构体中包含了isa指针,所以我们在Objc下可以认为是对象最后在它让人抓狂的语法(http://fuckingblocksyntax.com/)中,我们也可以发现函数特征,所以在Objc中我们也称之为匿名函数,函数块等。Block有什么用
2021年11月4日
其他

Flutter之美

相信你已经看到了flutter的强大之处,跨平台能力、高效的开发体验、先进的前端框架设计思想。可能唯一的不足就是它实在是太年轻了,但是也能看到在短短不到三年的时间里它所取得的成就,这足够让人兴奋。
2021年10月28日
其他

干货:探秘WKWebView

Mobile/14F89在iOS9之后提供了customUserAgent属性,直接为WKWebView设置User-Agent,而iOS9之前需要通过js写入的方式对H5注入User-Agent。
2021年10月21日
其他

Android自定义ViewGroup的那些事儿

本文字数:2463字预计阅读时间:7分钟概念ViewGroup是一种可以包含其他视图的特殊视图,他是各种布局和所有容器的基类,这些类也定义了ViewGroup.LayoutParams类作为类的布局参数,
2021年10月14日
其他

前端通用SEO技术优化指南

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年10月7日
其他

如何在Swift中实现状态机?

而如果是仅仅通过枚举来管理多种状态,那代码中就会有大量的当前状态判断的代码,很不易维护;如果要添加一个新的状态,那么原有状态判断的代码需要大量的修改,不满足开闭原则(对修改关闭,对拓展开放)等等。
2021年9月23日
其他

你真的了解符号化么?

https://developer.apple.com/documentation/xcode/adding-identifiable-symbol-names-to-a-crash-report
2021年9月16日
其他

Caffeine如何变热?

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年9月9日
其他

iOS:制作简易的 AAC 播放器 —— 了解音频的播放流程

Coding,是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。
2021年8月26日
其他

iOS的CoreData技术笔记

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年8月19日
其他

遵循 Google 应用指南的 Retrofit + Coroutine 封装

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年8月12日
其他

基于条件LayerNorm的多任务文本分类模型

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年8月5日
其他

Kaggle TOP1:神奇的时序Trick直接炸榜

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年7月22日
其他

MotionLayout动画从未如此简单!

这里是搜狐技术产品的知识分享平台。作为中国领先的互联网品牌,在拥有媒体、视频、搜索、游戏四大业务平台和超7亿用户的背后,搜狐始终致力于技术的创新与实践,更多实战干货和技术资讯将在此与您分享。
2021年7月15日