当前位置: 首页 > news >正文

使用ASIWebPageRequest库编写Objective-C下载器程序

使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequestASIWebPageRequest 中,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 中&#xff0c;ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先&#xff0c;你需要安装 ASIHT…...

代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛

101. 孤岛的总面积//思路大概是先计算面积&#xff0c;然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...

迷你世界脚本出生点接口:Spawnport

出生点接口&#xff1a;Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...

双链路提升网络传输的可靠性扩展可用带宽

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

Pytest测试用例执行跳过的3种方式

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

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】

闲话系列&#xff1a;每日一题&#xff0c;秃头有我&#xff0c;Hello&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;,我是IF‘Maxue&#xff0c;欢迎大佬们来参观我写的蓝桥杯系列&#xff0c;我好久没有更新博客了&#xff0c;因为up猪我寒假用自己的劳动换了…...

深度学习Save Best、Early Stop

一、Save Best 今天的大模型&#xff0c;在训练过程中可能会终止&#xff0c;但是模型其实是可以接着练的&#xff0c;假设GPU挂了&#xff0c;可以接着训练&#xff0c;在原有的权重上&#xff0c;训练其实就是更新w&#xff0c;如果前面对w进行了存档&#xff0c;那么可以从…...

数据库与存储优化

一、MySQL深度优化 索引优化 B树索引结构 结构特点&#xff1a; 平衡多路搜索树&#xff0c;所有数据存储在叶子节点&#xff0c;非叶子节点仅存键值和指针。叶子节点通过双向链表连接&#xff0c;支持范围查询高效遍历。 优势&#xff1a; 减少磁盘IO&#xff08;高扇出&#…...

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] 错误票据 - 洛谷 算法代码&#xff1a; #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 概念&#xff1a; 通俗的来说&#xff0c;链表是由一个个结点连接起来的就叫链表。 1.2 结构&#xff1a; 链表存储的数据 在 物理上是不一定连续的&#xff0c;它是由前面链接后面&#xff0c;一个个连起来的。 二、Java底层的 LinkedList 2.1…...

LLM run

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

k8s面试题总结(十)

1.为什么HDFS不适合存储小文件&#xff1f; 元数据存储在NameNode内存中&#xff0c;一个节点的内存是有限的。存储大量的小文件会消耗过多的寻道时间 同等大小一个大文件的访问速度一定比多个小文件访问速度快 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/⭐#​ 目的&#xff1a;对异配图进行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 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…...

unittest框架 核心知识的系统复习及与pytest的对比

1. unittest 介绍 是什么&#xff1a;Python 标准库自带的单元测试框架&#xff0c;遵循 xUnit 架构&#xff08;类似Java的JUnit&#xff09;。 核心概念&#xff1a; TestCase&#xff1a;测试用例的基类&#xff0c;所有测试类需继承它。 TestSuite&#xff1a;测试套件&a…...

vue面试宝典之二

39.vue2和vue3中源码是如何解析模版的 new vue&#xff08;&#xff09;的时候实例化了类之后根据传进去的option进行模版的类型div还是text还是啥进行匹配&#xff0c;同时拿到节点的值进行绑定&#xff0c;比如正则匹配{{}}将匹配到的变量拿去跟option中的data查找到具体的值…...

ESLint 深度解析:原理、规则与插件开发实践

在前端开发的复杂生态中&#xff0c;保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具&#xff0c;其默认规则与插件能满足多数常见需求&#xff0c;但面对特定团队规范或项目独特要求&#xff0c;自定义 ESLint 插件便成为有力的扩展手段…...

洛谷P1091

题目如下 思路 谢谢观看...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...