主线程调用locationServicesEnabled方法提示可能导致 UI unresponsiveness

iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式 iOS提供了两个框架用来定位以及地图显示。CoreLocation框架包含的类可以帮助设备确定位置和航向以及使用基于位置的有效信息。MapKit框架未定位提供了户用页面的支持(地图显示),里面包含了地图视图、卫星地图视图以及2D、3D混合视图,并且能够让开发人员管理地图标注和地图覆盖层,前者 用于标注地点(常见的地图大头针),后者用来突出某区域或者路线等。 本期内容: CLLocationMan... 阅读详情
AI摘要

本文介绍在iOS开发中如何避免在主线程上直接调用locationServicesEnabled方法导致UI无响应的问题。通过在后台线程检查定位服务状态,并在主线程处理结果,同时实现授权状态变化的回调,确保应用流畅运行。

在 iOS 开发中,调用 [CLLocationManager locationServicesEnabled] 方法时会提示 This method can cause UI unresponsiveness if invoked on the main thread. Instead, consider waiting for the -locationManagerDidChangeAuthorization: callback and checking authorizationStatus first. 这是因为在主线程上调用这个方法可能会导致 UI 无响应。为了避免这种情况,可以使用异步方法来检查定位服务是否启用。

以下是如何实现这一功能的步骤:

  1. 在主线程上异步检查定位服务:

    • 使用异步方法来检查 locationServicesEnabled 方法,这样可以避免阻塞主线程。
  2. 实现 -locationManagerDidChangeAuthorization: 回调:

    • 该回调方法会在授权状态发生变化时被调用,可以在这里检查当前的授权状态。
  3. 检查 authorizationStatus:

    • 在回调方法中检查 authorizationStatus,以确定是否已启用定位服务。

示例代码

下面是一个示例代码,展示如何实现这一功能:

#import <CoreLocation/CoreLocation.h>

@interface YourViewController () <CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

@implementation YourViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    
    // 请求授权
    [self.locationManager requestWhenInUseAuthorization];
    
    // 在主线程上异步检查定位服务
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        BOOL locationServicesEnabled = [CLLocationManager locationServicesEnabled];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self handleLocationServicesEnabled:locationServicesEnabled];
        });
    });
}

- (void)handleLocationServicesEnabled:(BOOL)enabled {
    if (enabled) {
        NSLog(@"Location services are enabled.");
    } else {
        NSLog(@"Location services are not enabled.");
    }
}

// 授权状态变化时调用
- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
    CLAuthorizationStatus status = manager.authorizationStatus;
    [self handleAuthorizationStatus:status];
}

- (void)handleAuthorizationStatus:(CLAuthorizationStatus)status {
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"Authorization status not determined.");
            break;
        case kCLAuthorizationStatusRestricted:
            NSLog(@"Authorization status restricted.");
            break;
        case kCLAuthorizationStatusDenied:
            NSLog(@"Authorization status denied.");
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            NSLog(@"Authorization status authorized always.");
            break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            NSLog(@"Authorization status authorized when in use.");
            break;
        default:
            break;
    }
}

@end

解释

  1. 在 viewDidLoad 中初始化 CLLocationManager 并设置其代理:

    • 请求用户授权使用定位服务。
    • 使用 dispatch_async 在后台线程检查 locationServicesEnabled,然后在主线程处理结果。
  2. handleLocationServicesEnabled: 方法:

    • 根据检查结果处理定位服务是否启用的情况。
  3. locationManagerDidChangeAuthorization: 方法:

    • 当授权状态发生变化时调用,检查当前的授权状态并进行相应处理。

通过这种方式,可以避免在主线程上调用 locationServicesEnabled 方法,从而防止 UI 无响应的问题。(成生TPGtahC由)

别再傻傻分不清!ROS中joint_state_publisher和robot_state_publisher到底谁管谁?(附launch文件实战) 本文深入解析ROS中joint_state_publisher和robot_state_publisher的核心区别与协作机制,帮助开发者避免常见配置错误。通过实战launch文件示例,详细说明两者在机器人状态发布链路中的角色分工:joint_state_publisher负责生成关节状态数据,而robot_state_publisher处理数据并发布TF变换,为RViz等下游模块提供统一接口。 阅读详情

相关推荐

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 451

线程相关知识

Synchronized和Lock区别、wait()和sleep()的区别、java是否可以开启线程、线程的并发与并行、线程的六种状态

稀里糊涂的小龙女 1084

cdh zookeeper未授权访问(安全漏洞)处理

前言: 最近公司在做安全漏洞扫描。发现cdh zookeeper存在未授权访问的问题。 ZooKeeper的节点有5种操作权限: CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写) 注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限 ZooKeeper的身份的认证有4种方式: world:默认方式,相当于全世界都能访问 auth:代表已经认证通过的..

belialxing的专栏 2446

iOS 在主线程操作UI不能保证安全

先看一下SDWebImage的一段代码 #ifndef dispatch_queue_async_safe #define dispatch_queue_async_safe(queue, block)\ if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)...

weixin_34007879的博客 486

极具性价比的步进电机驱动芯片-TMC2226/TMC2209使用小结

TMC2226/2209相对于TMC2660C、TMC5160来说,价格低了很多,同时功能并没有太多阉割。对比TMC5160,少了内部加减速曲线,电流足够(Ipeak = 2.8A),相对5160而言功能也很足够,所以毫无疑问TMC2226是极具性价比的步进驱动芯片。

Trinamic_TMC的博客 7004

Code Composer Studio 8.3.1安装与常见问题解决指南

本文提供了Code Composer Studio 8.3.1版本的详细安装指南与常见问题解决方案。内容涵盖从下载离线安装包、系统环境准备、自定义安装步骤,到首次启动配置及汉化建议。重点解析了安装过程中可能遇到的闪退、卡顿、Java虚拟机错误等典型问题的排查与修复方法,旨在帮助开发者高效部署这一稳定的嵌入式集成开发环境。

weixin_29195217的博客 329

This method should not be called on the main thread as it may lead to UI unresponsiveness.

This method should not be called on the main thread as it may lead to UI unresponsiveness.

huwan.cn的博客 1万+

【STK】手把手教你利用STK进行覆盖分析05-方位覆盖分析、覆盖网络检查工具和单对象覆盖分析

这一篇是我们STK覆盖模块的理论部分的最后一篇文章,之后会找尽可能多的论文来复现论文中关于STK覆盖模块的仿真的部分,到时候大家遇到不会的就可以结合前面的理论部分来看。

weixin_44184852的博客 1493

This method can cause UI unresponsiveness if invoked on the main thread.

避免同步检查:永远不要在或其他主线程方法中直接使用来决定UI流程。拥抱异步回调:依赖这个委托方法来响应权限状态的变化。这是最安全、最现代的方式。按需请求:在用户意图明确(如点击相关按钮)时再请求定位权限,这样系统提示框的出现对用户来说更合情合理,通过率也更高。处理所有状态:在你的代码中妥善处理(未决定)、(已授权)、.denied(已拒绝)等所有可能的授权状态,提供良好的用户引导。

humiaor的博客 1331

YOLOv13全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 439

Unity 面试篇|(六)数据结构和算法篇 【全面总结 | 持续更新】

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样遍历完后,堆中的10000个数就是所需的最大的10000个。桶排序是计数排序的升级版。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出1000*10000中的最终的结果。

游戏开发小Y的博客 12万+

Flutter坑坑收集

1、Waiting for another flutter command to release the startup lock... 在flutter项目在Packages get时关闭或者卡死下次再运行会出现该问题,并且导致模拟器无法连接 解决办法:flutter的安装目录/bin/cache下,删除lockfile文件,重启AS即可 未完待续。。。...

戒不掉的码瘾 755

自定义View系列教程04--Draw源码分析及其实践

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置。 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制。按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPriv

谷哥的小弟 2万+

JUC学习From狂神

线程进程 进程 一个进程可包含多个线程,至少包含一个 java默认有两个线程,一个main 一个GC 线程:开了一个写字板的进程,写字,自动保存(线程负责) Java开启线程:Thread、 Runnable 、Callable Java真的可以开启线程吗? 不行 /** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code&gt

m0_53891873的博客 355

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

This method should not be called on the main thread as it may lead to UI unresponsiveness报错

ios加载H5显示This method should not be called on the main thread as it may lead to UI unresponsiveness报错

zuo-yiran的博客 3521

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

判断定位状态 locationServicesEnabled

判断定位状态 locationServicesEnabled CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; if (kCLAuthorizationStatusDenied == status || kCLAuthorizationStatusRestricted == status) {

Terry的博客 2272

深度学习工具包 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")

Android中非主线程更新UI一定会报错吗?

Android中非主线程更新UI一定会报错吗? 先给出结论,不一定,有以下代码为证 以下五种方法在子线程更新UI都不会报错 class ViewImplActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view_i

m0_50262214的博客 507

iOS interview questions and Answers

http://gksanthoshbe.blogspot.com/2013/03/ios-interview-questions-and-answers.html 1-How would you create your own custom view? By Subclassing the UIView class. 2-Whats fast enumeration? F...

weixin_33922670的博客 4847

iOS开发系列--地图与定位

定位: 要实现地图、导航功能,往往需要先熟悉定位功能,在iOS中通过Core Location框架进行定位操作。Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图开发要配合定位框架使用。在Core Location中主要包含了定位、地理编码(包括反编码)功能。定位功能: 定位是一个很常用的功能,如一些地图软件打开之后如果用户允许软件定位的话,那么打开

Soccer_ZZM的博客 835

iOS14 定位问题导致WiFi名称获取不到的情况

1. 问题 在 iOS14 中如果不允许精确定位,那么就获取不到WiFi的名称了。 我的项目中获取WiFi名称的方式: + (NSString *)wifiName { NSArray *interfaces = CFBridgingRelease(CNCopySupportedInterfaces()); id info = nil; for (NSString *interfaceName in interfaces) { info = (__bridge_tra

iOS15011015的博客 5351

iOS11中的定位权限

前台定位权限 1,增加NSLocationWhenInUseUsageDescription。  2,创建CLLocationManager对象,在使用定位服务前调用requestWhenInUseAuthorization()。  3,通过func locationManager(_ manager: CLLocationManager, didChangeAuthorization

甜吖~的博客 5451

地图之CLLocationManager的使用 定位功能使用

1.iOS8以前使用CLLocationManager 1.导入头文件 2.创建位置管理者 CLLocationManager , 并添加到属性。3.设置代理、遵守协议、实现代理方法,在代理方法中获取位置信息4.调用开始更新位置方法 5.设置 每隔多远定位一次 和 精确度,精确度越高越耗电,定位时间越长 // 1.设置位置管理者属性 @property (nonatomic, stron

ioschenlu的博客 1305

iOS开发经验总结

http://www.jianshu.com/p/d333cf6ae4b0 在iOS开发中经常需要使用的或不常用的知识点的总结,几年的收藏和积累(踩过的坑)。 一、 iPhone Size 手机型号屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s 320 * 568 iPhone 6 6s 375 *...

weixin_30760895的博客 398

iOS-CLLocationManager请求获取用户定位时,是否要先判断用户之前有没有同意过?...

先上一段熟悉的代码提提神:) import CoreLocation let locationManager = CLLocationManager() locationManager.delegate = self ... locationManager.requestLocation() 复制代码比如说在做一款天气App的时候,我们首先需要请求用户的位置(locationManager.req...

weixin_34150224的博客 838

ios开发中的官方地图(CLLocationManager)使用

CLlocationManager

bruscar的专栏 2317

IOS4.2后CLLocationManager检测locationServicesEnabled是否开启方法

if([CLLocationManager respondsToSelector:@selector(authorizationStatus)]) { if( [CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied) { isSe...

zani的博客 868
上一篇: 在 Vue.js 中使用自定义指令(directive)来实现图片加载失败时显示默认占位图的功能
呆瑞克
博客等级 码龄15年 14粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值