「iOS」通过CoreLocation Framework深入了解MVC架构

EEGNet 网络代码解析与实战复现指南 本文详细解析了EEGNet这一轻量级卷积神经网络的结构与设计思想,重点阐述了其利用深度可分离卷积高效处理脑电信号的原理。文章提供了基于PyTorch的完整代码复现指南,包括网络搭建、数据模拟、训练调试及关键参数解析,旨在帮助读者掌握EEGNet的代码复现技巧,并将其应用于脑机接口等实际场景。 阅读详情

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构

前言

在这个学期的前段时间进行了MVC的相关学习,并且使用MVC完成了知乎日报奥的项目,加上学习的一些博客,开始对MVC这个架构有着更加深刻的理解,也体会到了MVC架构之中的缺点,这篇文章就是利用CoreLocation 这个原生关于定位的架构,来总结MVC的一些使用技巧和理解。

CoreLocation了解

根据需求建模

我们可以先来认识CoreLocation实现定位的相关内容,我们知道CoreLocation是一个关于位置定位的库,我们分析一下相关的功能,要想实现定位首先就需要一个位置类来对位置进行描述,属于它的属性应该有经纬度,海拔等相关信息;一个地标类来描述所处位置的城市街道;一个管理器来控制位置的变更,以及位置的获取;一个解析器根据当前的位置信息转化为地标。那么逻辑如此,对应的图片关系如下

img

我们可以在CoreLocation Framework之中找到了对应的这几个类的相关属性,这里我简单的给出这些类之中的部分头文件

CLLocation:

@interface CLLocation : NSObject <NSCopying, NSSecureCoding> 

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;//返回当前位置的坐标。
@property(readonly, nonatomic) CLLocationDistance altitude;// 返回位置的高度,正值表示海平面上,负值表示海平面下。

- (instancetype)initWithLatitude:(CLLocationDegrees)latitude
    longitude:(CLLocationDegrees)longitude;//初始化指定经纬度的位置。
    
@end

CLPlacemark:

@interface CLPlacemark : NSObject <NSCopying, NSSecureCoding>

// 通过已有地标初始化新地标并复制其数据
- (instancetype)initWithPlacemark:(CLPlacemark *) placemark;

// 获取与地标相关联的地理位置信息
@property (nonatomic, readonly, copy, nullable) CLLocation *location;

// 城市名称(如Cupertino)
@property (nonatomic, readonly, copy, nullable) NSString *locality; 
......
// 一系列地标相关的具体属性,用于更详细地描述位置信息

CLLocationManager:

@interface CLLocationManager : NSObject 
// 获取调用应用的当前授权状态
@property (nonatomic, readonly) CLAuthorizationStatus authorizationStatus API_AVAILABLE(ios(14.0), macos(11.0), watchos(7.0), tvos(14.0));

// 获取最后接收到的位置信息,在接收到位置前为nil
@property(readonly, nonatomic, copy, nullable) CLLocation *location;

// 判断用户是否启用了位置服务
+ (BOOL)locationServicesEnabled API_AVAILABLE(ios(4.0), macos(10.7));

// 开始更新位置信息
- (void)startUpdatingLocation API_AVAILABLE(watchos(3.0)) API_UNAVAILABLE(tvos);

// 停止更新位置信息
- (void)stopUpdatingLocation;

@end

CLGeocoder:

// 定义地理编码完成后的回调处理块,CLPlacemarks按可信度从高到低排列
@interface CLGeocoder : NSObject
typedef void (^CLGeocodeCompletionHandler)(NSArray< CLPlacemark *> * __nullable placemarks, NSError * __nullable error);

@interface CLGeocoder : NSObject
// 判断是否正在进行地理编码操作
@property (nonatomic, readonly, getter=isGeocoding) BOOL geocoding;

// 反向地理编码请求,根据给定位置获取对应的地标信息
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

// 用地址字符串进行地理编码(默认无区域和首选语言环境设置)
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
@end

CLLocationManagerDelegate:

@protocol CLLocationManagerDelegate<NSObject>

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray<CLLocation *> *)locations;

@end

设计属性

我们可以从这些类的设计学习一些MVC架构的设计思想

从刚刚的头文件我们可以看到,其实头文件之中的许多属性是被标注为只读,标志为只读其实对于解耦合实现规范代码有着很大的帮助,比如CLLocationManager之中的location属性,因为这个位置管理器只是用来管理这个当前的位置,对于外部的使用者来说,只需要在适当的时候进行访问而不是修改。对应数据的更新和维护其实就是这个类内部的负责。

我们就可以提炼出一个设计准则:外部使用者只要负责读取数据,具体的数据更新则是由提供者来完成

这种设计思想其实很清晰的将层次分开了,我们这样不仅成功保护了相关数据的安全,也能进一步的减少相关属性值的滥用。

具体的操作大佬的博客归结为:

  1. 业务类中的属性设计为只读。使用者只能通过属性来读取数据。而由业务类中的方法内部来更新这些属性的值。
  2. 数据模型类中的属性定义最好也设置为只读,因为数据模型的建立是在业务类方法内部完成并通过通知或者异步回调的方式交给使用者。而不应该交由使用者来创建和更新。
  3. 数据模型类一般提供一个带有所有属性的init初始化方法,而初始化后这些属性原则上是不能被再次改变,所以应该设置为只读属性。

这里的类全部指的是暴露在头文件之中的属性声明

至于对于类内容,我们需要在内部(即.m文件)修改相关的声明

@interface CLLocationManager ()

@property(nonatomic, copy, nullable) CLLocation *location;
@end

//也可以改用以下形式
@implementation CLLocationManager {
		CLLocation *_location;
}


@end

方法设计

协议传值

当我们类设计结束之后,随之而来的就是类方法的设计类。无论如何,我们的业务模型最后总是会走向网络请求或者数据库调用这种需要,在获取操作之后再进行异步的操作。在这里CoreLocation的框架,使用的是Delegate和Blockzhe这两种方式进行回调

先看CLLocationManager定义的属性

 @property(assign, nonatomic, nullable) id<CLLocationManagerDelegate> delegate;

这个协议实现了

@protocol CLLocationManagerDelegate<NSObject>

@optional
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray<CLLocation *> *)locations API_AVAILABLE(ios(6.0), macos(10.9));

@end

当位置管理器对象更新了当前的位置后就会调用delegate属性所指对象的didUpdateLocations方法来通知。

这就产生了几个问题:

  1. 谁来创建M层的位置管理对象?
    C层,这个其实很简单,控制器是负责控制和协调M层,所以C层具有负责创建并持有M层对象的责任,C层也是一个使用观察者。

  2. M层如何来实现实时的更新和停止更新?
    对于位置管理器之中,有以下两个方法

- (void)startUpdatingLocation API_AVAILABLE(watchos(3.0)) __TVOS_PROHIBITED;

- (void)stopUpdatingLocation;

好像是在tableView也有相似的两个方法beginUpdates和endUpdates,通过方法通知tableView的数据源发生更新进而更新cell。位置管理器之中的这两个方法通过通知管理器,位置类的数据(即M层)在内部发生变化。至于这个两个方法是如何实现位置管理器之中持有的位置类的变化,就是内部实现的内容,相当于一个黑盒,我们作为M层的使用者不需要知道里面的实现原理。

  1. 谁来负责调用M层提供的那些方法?
    答案是: 控制器C层。因为控制器既然负责M层对象的构建,那他当然也是负责M层方法的调用了。

  2. 谁来观察M层的数据变化通知并进行相应的处理?
    答案是: 控制器C层。因为C层既然负责调用M层所提供的方法,那么他理所当然的也要负责对方法的返回以及更新进行处理。在这里我们的C层控制器需要实现CLLocationManagerDelegate接口,并赋值给位置管理器对象的delegate属性。

这里引用大佬博客之中的内容

我们知道MVC结构中,C层是负责协调和调度M和V层的一个非常关键的角色。而C和M以及V之间的交互协调方式用的最多的也是通过Delegate这种模式,Delegate这种模式并不局限在M和C之间,同样也可以应用在V和C之间。Delegate的本质其实是一种双方之间通信的接口,而通过接口来进行通信则可以最大限度的减少对象之间交互的耦合性。

Block传值

除了用Delegate外,我们还可以用Block回调这种方式来实现方法调用的异步通知处理。标准格式如下:

  typedef void (^BlockHandler)(id obj, NSError * error);

在地标解析器CLGeocoder之中,采用的就是block回调这种方式来实现异步通知的。我们来看看类的部分定义:

typedef void (^CLGeocodeCompletionHandler)(NSArray< CLPlacemark *> * __nullable placemarks, NSError * __nullable error);

// 反向地理编码请求,根据给定位置获取对应的地标信息
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

// 用地址字符串进行地理编码(默认无区域和首选语言环境设置)
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

从反向地理编码请求可以看出来,我们根据一个CLLocation方向解码出一个CLPlacemark的对象,用一个block来完成内容的回调


   //VC中的某个点击按钮事件:

-(void)ClickHandle:(UIButton*)sender
{
      sender.userInteractionEnabled = NO;
       __weak XXXVC  *weakSelf = self;
    
      //geocoder也可以是XXXVC里面的一个属性,从而可以避免重复建立
      CLGeocoder  *geocoder = [CLGeocoder new];
  
      //假设知道了某个位置对象location
      [geocoder  reverseGeocodeLocation:location 
                      completionHandler:^(NSArray< CLPlacemark *> * placemarks, NSError * error)){
      
          if (weakSelf == nil)
               return;
          sender.userInteractionEnabled = YES;
         if (error == nil)
         {
             //处理placemarks对象
         }
         else
        {
            //处理错误
        }
     }];  
}

这里的block回调,其实在没有异步的情况下(即读取本地库)是可以不需要写的,但是在我们实际的编写过程当中,还是尽可能的遵循统一的相关的模式,有时候需求是会改变的,如果我们这个操作要改为异步操作的话,那么代码需要整段修改,还包括C层的代码,修改起来很麻烦。那么不如就在一开始就使用block进行回调,有统一的格式以及便于理解的优点。

KVO

上面简单展示了Delegate与Block机制用于实现M层数据的更新,前面介绍了这两个机制的优点,下面引用博客的内容,概括这两者的缺点,顺带引入对应的KVO机制监听的内容:

Delegate的方式必须要事先定义出一个接口协议来,并且调用者和实现者都需要按照这个接口规则来进行通知和数据处理交互,这样无形中就产生了一定的耦合性。也就是二者之间还是具有隐式的依赖形式。不利于扩展和进行完全自定义处理。

block方式的缺点则是使用不好则会产生循环引用的问题从而产生内存泄露,另外就是用block机制在出错后难以调试以及难以进行问题跟踪。 而且block机制其实也是需要在调用者和实现之间预先定义一个标准的BlockHandler接口来进行交互和处理。block机制还有一个缺陷是会在代码中产生多重嵌套,从而影响代码的美观和可读性。

Delegate和block方式虽然都是一种观察者实现,但却不是标准和经典的观察者模式。因为这两种模式是无法实现多观察者的。也就是说当数据更新而进行通知时,只能有一个观察者进行监听和处理,不能实现多个观察者的通知更新处理。

可惜的是在CoreLocation Framework并不支持KVO之中方式,下面是大佬假设其支持KVO写出的相关代码。

//再次申明的是CCLocationManager是不支持KVO来监听位置变化的,这里只是一个假设支持的话的使用方法。

@interface AppDelegate
    @property(nonatomic, strong)  CLLocationManager *locationManager;
@end

@implementation  AppDelegate

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.locationManager = [CLLocationManager new];
        [self.locationManager  startUpdatingLocation];  //开始监听位置变化
    return YES;
}
@end


//第一个页面
@implementation  VC1

-(void)viewWillAppear:(BOOL)animated
{
     [  [UIApplication sharedApplication].delegate.locationManager  addObserver:self  forKeyPath:@"location" options:NSKeyValueObservingOptionNew context:NULL];
}


-(void)viewWillDisappear:(BOOL)animated
{
      [ [UIApplication sharedApplication].delegate.locationManager  removeObserver:self  forKeyPath:@"location" ];

}

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context
{
     //这里处理位置变化时的逻辑。
}
@end


//第二个页面
@implementation  VC2

-(void)viewWillAppear:(BOOL)animated
{
     [  [UIApplication sharedApplication].delegate.locationManager  addObserver:self  forKeyPath:@"location" options:NSKeyValueObservingOptionNew context:NULL];
}


-(void)viewWillDisappear:(BOOL)animated
{
      [ [UIApplication sharedApplication].delegate.locationManager  removeObserver:self  forKeyPath:@"location" ];

}

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context
{
     //这里处理位置变化时的逻辑。
}
@end

//.. 其他页面

接下来分析一下在什么情况下使用KVO:

  1. 最显而易见的,当我这个数据更新可能会引起多个依赖该对象的对象更新时使用KVO
  2. 当某个对象,在对应流程之中会创建多个副本,而且在这个副本的状态会不断产生变化,当副本增多的情况下,我们就需要使用KVO机制来根据新的状态来处理。

下面是我们使用多副本且不使用KVO的相关流程

img

使用KVO+单例,KVO在这里的意义就是,通知这个单例属性状态已经被改变,进行对应的更新

img

Notification通知方式

KVO模式实现了一种对属性变化的通知观察机制。而且这种机制由系统来完成,缺点就是他只是对属性的变化进行观察,而不能对某些异步方法调用进行通知处理。而如果我们想要正真的实现观察者模式而不局限于属性呢?答案就是iOS的NSNotificationCenter。

但是这个模式对应的也存在一些缺点,就使用通知的代码较为松散,在一定程度上,不利于程序的解读。看前面的内容,通过Delegate或者block时来设计业务层方法的回调时,可以很清楚的知道业务调用方法和实现机制的上下文,因为这些东西在代码定义里面就已经固化了,我们必须额外的去学习和了解哪些业务层的方法需要添加观察者哪些不需要,而且代码中不管在什么时候需要都要在初始化时添加一段代码上去。通知处理逻辑的可读写性以及代码的可读性也比较差。

总结

其实这篇文章写着写着,和前面写的五大传值方法其实有些重合,主要就是当时在学习传值技巧的时候还没有学到MVC架构,之前的学习还是停留在较为表面的,通过这次学习加深了对传值和MVC架构结合的理解

参考文章

论MVVM伪框架结构和MVC中M的实现机制

控制层的设计方法

模型层设计方法

fsQCA实战:从数据校准到结果解读的完整流程(附R代码示例) 本文提供了一份完整的模糊集定性比较分析(fsQCA)实战指南,详细阐述了从数据校准、必要条件分析、真值表构建到布尔最小化与结果解读的全流程。通过R语言代码示例,帮助研究者掌握如何将理论转化为可操作的分析步骤,并产出稳健的中间解,以揭示导致结果的复杂条件组合。 阅读详情

相关推荐

SAP生产订单成本‘还原’实战:从标准成本到实际费用,一步步拆解差异来源(附物料分类账提示)

本文深入解析SAP生产订单成本差异分析的全过程,从标准成本到实际费用的追踪方法,揭示差异根源的六维分析法。特别强调物料分类账(CKMLCP)在成本还原中的关键作用,帮助财务人员精准定位价格差异、用量差异等问题,提升制造业成本管理的效率和准确性。

weixin_28705087的博客 531

iOS定位-利用CoreLocation.framework获取当前城市

利用CoreLocation.framework获取当前城市

Setoge的博客 1446

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

IOS位置和地图 CoreLocation框架

文章目录介绍CLLocationManager类常用功能介绍CLLocationManagerDelegate代理协议CLLocation类常用功能介绍基本使用举例地理信息编码简介CLGeocoder类简介举例1由地址获取经纬度举例2由经纬度获取地址CLPlacemark类简介 介绍 CoreLocation框架对iOS设备的定位功能进行了封装,通过CoreLocation框架可以获取iOS设备的...

煮酒Shae 1761

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 392

pwm电机调速的原理介绍与代码实现

1、pwm实现调速的原理与介绍 PWM(Pulse Width Modulation)脉冲宽度调制。 1)占空比 pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。 那么重点就在于如何调节PWM波形的输出。如下图所示 图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4

Clichong 7万+

CoreLocation.framework

一、导入CoreLocation.framework  二、#import   三、声明代理 CLLocationManagerDelegate> 四、代码实现 1、声明 ? 1 2 3 4 5 6 7 8 9 10 11 12 CLLocatio

qq_14871089的专栏 526

win2012没有远程桌面授权服务器可以提供许可证 如何远程

如果远程windows服务器时,提示“没有远程桌面授权服务器可以提供许可证 如何远程”,先通过以下方式进行强制登录,然后在对服务器进行设置即可,延期使用。 强制登录服务器方式; 1、运行—输入:mstsc /admin /v ip:端口 回车即可 2、进入远程桌面,输入 ip:端口 /admin 例如:mstsc /admin /v 192.168.0.131:23568 进入服务器以后,按照以下步骤进行设置即可: ...

蜗牛快爬 1万+

第九章:使用CoreLocation定位

CoreLocation框架(CoreLocation.framework)可用于定位设备当前的经纬度,通过该框架,应用程序可通过附近的蜂窝基站、WIFI信号或者GPS等信息计算用户位置。iOS SDK提供了CLLocationManager、CLLocationManagerDelegate来处理设备的定位信息,包括获取设备的方向以及进行方向检测等。其中CLLocationManager是整个Co

xiaoxiaobukuang的专栏 8119

Python 实战:全面解析“微信搜一搜”内容爬取,从入门到企业级架构

本文将带你从零搭建爬虫项目,采用 Requests、Scrapy、Selenium、Proxy 池、中间人监控(如 Fiddler/mitmproxy)、分布式调度、数据库持久化、断点续抓等方案,实现可持续、抗封能力强的内容抓取系统。理解“微信搜一搜”页面结构与 Javascript 渲染逻辑;使用 Scrapy 框架搭建分布式爬虫;使用 Selenium 模拟浏览器抓取;构建代理池提升爬取成功率;对抗验证码、IP 封禁与 cookie 过期问题;

2201_76125261的博客 1392

13、混合系统的离散与连续交互

本文详细探讨了混合系统中离散事件与连续动态的交互机制,涵盖了建模方法、分析技术、设计挑战以及多种控制策略。通过具体案例研究和操作语义的定义,展示了混合系统在制造业、交通系统、机器人技术和过程控制等领域的广泛应用。文章还介绍了实验仿真、稳定性研究及优化方法,旨在帮助读者全面理解混合系统的设计与控制要点,并为未来智能化和自适应混合系统的发展提供了展望。

5f4d3s2a1q的博客 126

Core Location Framework学习

在Apple开发中,尤其是移动设备开发,经常会使用Core Location Framework,这个框架可以使得iOS设备获取当前的地理位置。本文就具体到Core Location 框架中,查看其声明源码。 CLHeading.h 代表了一个可以通过(x,y,z)三维空间坐标确定磁北极位置的向量。精确的Heading(方位)定位,同时也需要时间信息(即通过空间加时间四维坐...

weixin_30389003的博客 183

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1606

21道工作中总结的iOS高频面试题

1、除了MVC模式,还熟悉哪些模式? 代理模式:当一个类的某些功能需要有别的类实现,但又不确定具体那个类实现的, 单例模式:确保程序运行期,某个类只有一份实例,用于进行资源共享 工厂模式:工厂模式创建的实例,多余proxy模式配合,创建可替代的类 观察者模式:一般为model层,对controller和view进行通知,不关心谁接收,只负责发布消息 策略模式:定义算法,封装起来,使他们之

shenhailiu的博客 546

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

CoreLocation.framework框架基本用法

// // ViewController.m // Search // // Created by lcy on 16/1/14. // Copyright (c) 2016年 lcy. All rights reserved. // #import "ViewController.h" #import #import "CYAnnotationView.h" @interface

远远100的专栏 980

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

CoreLocation框架的简单介绍

今天重新看了看coreLocation框架 ,自己简单的在Xcode敲了一遍,然后分享过来给各位看看.希望对新人来说有点帮助把

wutaohan的专栏 789

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

iOS 多语言本地化教程,VS Code KXApp 编辑 String Catalog .xcstrings

做 iOS 多语言本地化总要在 VS Code 和 Xcode 之间来回切?这篇讲用 KXApp(快蝎)在 VS Code 里直接编辑 String Catalog(.xcstrings):双击打开和 Xcode 一样的表格,`.xcstrings` 与老的 `.strings`、`.stringsdict` 同表编辑,加语言同步登记到工程、从源码扫描同步新 key,复数、设备变体和变量占位都在表里处理,改源语言文本后已有翻译自动标需复核。文件仍是标准格式,回 Xcode 打开一致。

2501_91592143的博客 148

4G 功能机操作系统选型指南:KaiOS、Mocor、MAUI、PMAOS 的能力边界与验证方法

4G 功能机如何选择操作系统?本文梳理 KaiOS、Mocor、MAUI、PMAOS 四条路线的技术定位与能力边界,从市场认证、应用清单、芯片与 BSP、内存与整机成本、交付维护五个维度建立选型流程,并提供场景决策矩阵和签约前八项验证清单,帮助研发与产品团队区分平台宣称、演示能力与目标机型的实际交付能力。

PMAOS的博客 174

iOS 小组件开发,Windows 上用 KXBuild 加 WidgetKit 扩展 给 App 加 iOS 桌面小组件

iOS 小组件开发用 WidgetKit。这篇在 Windows 上用 KXBuild 的 add-target --type widget 给 SwiftUI 工程加一个桌面小组件扩展:写时间线和主屏小号/中号、锁屏圆形多种尺寸界面,用 App Group 和 App 共享数据,App 里调 WidgetCenter 主动刷新,按 F5 装到 iOS 17+ 的 iPhone 调试,再随 ipa 一起上架。以喝水打卡为例,附 App ID、描述文件准备和小组件不刷新、签名报错的排查。

2501_91600747的博客 175

芯参谋(83):AliOS Things_驱动开发指南

本指南针对AliOSThings驱动开发中的核心痛点,系统梳理了从硬件配置到组件交付的全流程。聚焦“初始化顺序”“分级加载”“CSI隔离”“VFS挂载”等关键问题,提供可照搬的八步开发流程、骨架代码与核查清单。通过明确驱动类型选择、组件化管理、板级静态配置(无DTS)及内核态/用户态运行模式,解决“驱动不注册”“open失败”“偶发死机”等典型难题。配套模板与实战案例,确保驱动可复现、可维护、可裁剪,适用于V3.x弹性微内核平台,助力开发者高效完成稳定可靠的外设驱动开发。

qq520131714的专栏 466

安卓IOS打包证书

.p12 、 .mobileprovision 、 keystore 相关证书申请

weixin_58431406的博客 267

React Native项目开发(iOS侧为例)

本文基于React Native 0.71+,通过npx react-native init初始化项目后,详细讲解如何使用TypeScript搭建两个页面:入口页(Entrance.tsx)和我的页面(Profile.tsx)。重点介绍了配置tsconfig.json、初始化TypeScript环境、集成React Navigation实现页面跳转,并通过创建共享类型文件(navigation.ts)实现路由类型安全。文章还涵盖依赖安装、iOS构建问题排查、目录结构规范及常见错误解决方案。

D_xw_的博客 225

iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送

iOS 推送通知要跑通,核心是 App ID 开通 Push Notifications 并重新生成描述文件、签名带上 aps-environment、再用 APNs 的 .p8 密钥签 JWT 把推送发到设备令牌。这篇用 KXBuild 按五步做:开能力、加 entitlements、代码里请求权限拿设备令牌、建 .p8 认证密钥、用一段 Node 脚本或 curl 走 HTTP/2 发测试推送,让 iPhone 弹出第一条通知。附拿不到令牌、APNs 报错码、TestFlight 收不到的排查。

2501_91591841的博客 208

[iOS]Runtime2

为了让你在父类中依然能访问当前对象(也就是子类的实例),编译器在底层会生成一个结构体,叫 : 当调用 时,底层调用的函数是 : 拿着(也就是当前的子类对象)作为消息接收者,但是把方法查找的起点定位在了 (父类)这里需要注意的就是仍然是调用者自己,即先讲一下上篇没讲过的,我们如果缓存未命中,那我们就会进入慢速查找,现在我们来详细的讲解在进入慢速查找的瞬间会再看一遍方法列表,然后立刻调用加锁,因为多线程下别人正在动态添加方法或者扩容,不加锁会崩溃类就绪OC的机制就是在编译期只生成了 结构,当类首次被发送消息时(

wzm20070304的博客 205

iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标

上架前,iOS 的 App 图标、启动屏和多语言这三样配不齐,上传时就可能被拦或显示不对。这篇用 KXBuild 一次配好:图标只要一张 1024×1024、不带透明通道的 PNG,在资源目录编辑器里右键就生成全部尺寸,还支持 iOS 18 深色/着色和 Xcode 26 的 .icon;启动屏在 Info.plist 的 UILaunchScreen 填背景色和 Logo;界面文字、App 名称用 .xcstrings 翻译,商店信息再到 App Store Connect 按语言填。附上架前检查清单。

2501_91600889的博客 261

React Native iOS 项目搭建

本文系统梳理了React Native iOS开发的环境检测与项目搭建全流程。强调环境问题占报错70%根因,需优先验证Node/npm、Watchman、Xcode工具链、模拟器运行时等关键项。通过官方CLI初始化项目,配合CocoaPods管理原生依赖,实现从环境验收到首跑成功的闭环。基于React Navigation构建双Tab嵌套导航,结合AsyncStorage实现本地持久化,完成用户列表、详情页、我的页等核心功能。最后提供调试技巧与高频报错解决方案,助力开发者高效落地RN项目。

D_xw_的博客 438
上一篇: 「OC」GCD的相关练习
下一篇: 知乎日报——第四周
小鹿撞出了脑震荡
博客等级 码龄3年 1107粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值