使用ASIWebPageRequest库编写Objective-C下载器程序
使用 ASIWebPageRequest
库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest
和 ASIWebPageRequest
中,ASIWebPageRequest
是专门用于下载网页及其资源的库。
1. 安装 ASIWebPageRequest
首先,你需要安装 ASIHTTPRequest
库(ASIWebPageRequest
是它的一个部分)。由于这个库已经不再更新,推荐使用 CocoaPods
来安装:
在 Podfile
中添加以下内容:
pod 'ASIHTTPRequest', '~> 1.8.0'
然后执行:
pod install
2. 导入库
在你的 .h
文件中导入所需要的头文件:
#import "ASIWebPageRequest.h"
3. 编写下载器程序
下面是一个使用 ASIWebPageRequest
下载网页并获取网页内容的简单程序。
(1) 创建下载器
在你的 ViewController 或者其他类中,编写下载器代码:
#import "ViewController.h"
#import "ASIWebPageRequest.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 创建并初始化 ASIWebPageRequest 对象NSURL *url = [NSURL URLWithString:@"https://www.example.com"];ASIWebPageRequest *request = [ASIWebPageRequest requestWithURL:url];// 设置完成回调[request setCompletionBlock:^{// 下载完成时的处理NSData *webPageData = [request responseData]; // 获取网页数据NSString *webPageString = [[NSString alloc] initWithData:webPageData encoding:NSUTF8StringEncoding];NSLog(@"网页内容:%@", webPageString); // 打印网页内容}];// 设置失败回调[request setFailedBlock:^{NSError *error = [request error];NSLog(@"请求失败:%@", error.localizedDescription);}];// 开始请求[request startAsynchronous];
}@end
4. 解释代码
-
创建
ASIWebPageRequest
对象:通过ASIWebPageRequest
的构造方法创建一个请求对象,并传入目标 URL。 -
设置回调:
setCompletionBlock
是请求成功时的回调。在这里,我们通过responseData
获取网页数据,并将其转换成字符串进行打印。setFailedBlock
是请求失败时的回调。在这里,我们通过error
属性获取错误信息并打印。
-
启动请求:使用
startAsynchronous
方法启动异步请求。
5. 处理进度和超时
你可以进一步优化程序,例如设置请求的超时时间或获取下载进度。以下是如何处理进度和超时设置:
(1) 设置超时时间
[request setTimeOutSeconds:30]; // 设置超时为30秒
(2) 获取下载进度
[request setDownloadProgressDelegate:self]; // 设置当前视图控制器为进度代理
然后实现 ASIProgressDelegate
协议中的方法:
- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes
{CGFloat progress = (CGFloat)bytes / (CGFloat)[request contentLength];NSLog(@"下载进度: %.2f%%", progress * 100);
}
6. 保存下载的文件
如果你想将网页内容或文件保存到本地,可以使用 writeToFile
方法:
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/example.html"];
[webPageData writeToFile:filePath atomically:YES];
NSLog(@"文件已保存到:%@", filePath);
7. 完整示例
以下是一个完整的例子:
#import "ViewController.h"
#import "ASIWebPageRequest.h"@interface ViewController () <ASIProgressDelegate>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 创建并初始化 ASIWebPageRequest 对象NSURL *url = [NSURL URLWithString:@"https://www.example.com"];ASIWebPageRequest *request = [ASIWebPageRequest requestWithURL:url];// 设置超时时间[request setTimeOutSeconds:30];// 设置进度代理[request setDownloadProgressDelegate:self];// 设置完成回调[request setCompletionBlock:^{NSData *webPageData = [request responseData]; // 获取网页内容NSString *webPageString = [[NSString alloc] initWithData:webPageData encoding:NSUTF8StringEncoding];NSLog(@"网页内容:%@", webPageString);// 保存文件NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/example.html"];[webPageData writeToFile:filePath atomically:YES];NSLog(@"文件已保存到:%@", filePath);}];// 设置失败回调[request setFailedBlock:^{NSError *error = [request error];NSLog(@"请求失败:%@", error.localizedDescription);}];// 开始异步请求[request startAsynchronous];
}- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes {CGFloat progress = (CGFloat)bytes / (CGFloat)[request contentLength];NSLog(@"下载进度: %.2f%%", progress * 100);
}@end
8. 总结
通过 ASIWebPageRequest
库,你可以方便地实现网页下载、获取网页内容以及处理下载进度。尽管该库已经不再维护,但它仍然是许多 iOS 开发者常用的工具之一。通过设置异步请求和回调,您可以轻松地进行网页内容的下载并进行相应的处理。
相关文章:
使用ASIWebPageRequest库编写Objective-C下载器程序
使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest 和 ASIWebPageRequest 中,ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先,你需要安装 ASIHT…...
代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
101. 孤岛的总面积//思路大概是先计算面积,然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...
迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...

双链路提升网络传输的可靠性扩展可用带宽
为了提升网络传输的可靠性或增加网络可用带宽, 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…...

Pytest测试用例执行跳过的3种方式
文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中,我们可能某条测试用例没写完,代码执行时会报错,或者是在一些条件下不让某些…...

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】
闲话系列:每日一题,秃头有我,Hello!!!!!,我是IF‘Maxue,欢迎大佬们来参观我写的蓝桥杯系列,我好久没有更新博客了,因为up猪我寒假用自己的劳动换了…...
深度学习Save Best、Early Stop
一、Save Best 今天的大模型,在训练过程中可能会终止,但是模型其实是可以接着练的,假设GPU挂了,可以接着训练,在原有的权重上,训练其实就是更新w,如果前面对w进行了存档,那么可以从…...
数据库与存储优化
一、MySQL深度优化 索引优化 B树索引结构 结构特点: 平衡多路搜索树,所有数据存储在叶子节点,非叶子节点仅存键值和指针。叶子节点通过双向链表连接,支持范围查询高效遍历。 优势: 减少磁盘IO(高扇出&#…...

Android15请求动态申请存储权限完整示例
效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...

C/C++蓝桥杯算法真题打卡(Day3)
一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

【数据结构与算法】Java描述:第二节:LinkedList 链表
一、链表的概念与结构 1.1 概念: 通俗的来说,链表是由一个个结点连接起来的就叫链表。 1.2 结构: 链表存储的数据 在 物理上是不一定连续的,它是由前面链接后面,一个个连起来的。 二、Java底层的 LinkedList 2.1…...

LLM run
lmstudio lmstudio ollama ollama N 卡使用自带UI gpu加速推理 ,选择满足条件的, ds模型选择列表 https://ollama.com/library/deepseek-r1 a卡当前支持的显卡型号 I卡 gpu加速配置 2025.3 intel Official project optimization https://www.modelscope.cn/m…...

k8s面试题总结(十)
1.为什么HDFS不适合存储小文件? 元数据存储在NameNode内存中,一个节点的内存是有限的。存储大量的小文件会消耗过多的寻道时间 同等大小一个大文件的访问速度一定比多个小文件访问速度快 3.NameNode存储block的数量是有限的 比如你一个block元数据需要消…...
android中activity1和activity2中接收定时消息
android中activity1和activity2中接收定时消息 业务类 import java.util.Timer; import java.util.TimerTask;public class MyAnager {private MyAnager() {}private static MyAnager instance;//回调接口onRecvTaskpublic interface OnMsgListener {void onRecvTask(String a…...

Non-Homophilic Graph Pre-Training and Prompt Learning
Non-Homophilic Graph Pre-Training and Prompt Learning KDD25 #paper/⭐# 目的:对异配图进行prompt 方法 邻居节点的综合嵌入 s v 1 ∣ V ( S v ) ∣ ∑ u ∈ V ( S v ) h u ⋅ s i m ( h u , h v ) , \mathbf{s}_{v}\frac{1}{|V(S_{v})|}\su…...

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
Ollama 是一款开源的本地大语言模型(LLM)运行框架,用于管理和运行语言模型。具有以下核心特点: 开源可定制:采用 MIT 开源协议,开发者能自由使用、阅读源码并定制,可根据自身需求进行功能扩展和…...
unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。 核心概念: TestCase:测试用例的基类,所有测试类需继承它。 TestSuite:测试套件&a…...
vue面试宝典之二
39.vue2和vue3中源码是如何解析模版的 new vue()的时候实例化了类之后根据传进去的option进行模版的类型div还是text还是啥进行匹配,同时拿到节点的值进行绑定,比如正则匹配{{}}将匹配到的变量拿去跟option中的data查找到具体的值…...
ESLint 深度解析:原理、规则与插件开发实践
在前端开发的复杂生态中,保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具,其默认规则与插件能满足多数常见需求,但面对特定团队规范或项目独特要求,自定义 ESLint 插件便成为有力的扩展手段…...

洛谷P1091
题目如下 思路 谢谢观看...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...