• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 排队 NSURLRequest 以模拟同步的阻塞请求

[复制链接]
菜鸟教程小白 发表于 2022-12-13 15:52:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在与网络控制的硬件设备进行交互。您通过 URL(例如http://device/on?port=1http://device/off?port= 3) 打开和关闭东西,它发回“成功”或“失败”。然而,它是一个简单的设备,所以在它处理请求时——,直到它返回它正在处理的请求的状态——它将忽略所有后续请求。它不会将它们排队;他们只是迷路了。

所以我需要发送串行、同步的请求。 ,req#1,等待响应#1,req#2,等待响应#2,req#3,等待响应#3,等等。

我是否需要管理自己的线程安全请求队列,让 UI 线程将请求推送到队列的一端,并让另一个线程将请求拉出,一次一个,与前一个一样完成或超时,并将结果发送回 UI 线程?还是我在 API 中遗漏了一些已经做到这一点的东西?

谢谢!

...R



Best Answer-推荐答案


应该起作用的是使用一个 NSOperationQueue 实例,以及许多执行各种 URL 请求的 NSOperation 实例。

首先,在类中设置一个队列,将请求排入队列。确保强烈引用它,即

@interface MyEnqueingClass ()

@property (nonatomic, strong) NSOperationQueue *operationQueue;

@end

在实现中的某个地方,比如 init 方法:

    _operationQueue = [[NSOperationQueue alloc] init];
    _operationQueue.maxConcurrentOperationCount = 1;

您基本上需要一个串行队列,因此 maxConcurrentOperationCount 为 1。

设置完成后,您需要编写如下代码:

[self.operationQueue addOperationWithBlock:^{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString"my://URLString"]];
    NSError *error;
    NSURLResponse *response;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (!responseData)
    {
        //Maybe try this request again instead of completely restarting? Depends on your application.
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //Do something here to handle the error - maybe you need to cancel all the enqueued operations and start again?
            [self.operationQueue cancelAllOperations];
            [self startOver];
        }];
    }
    else
    {
        //Handle the success case;
    }
}];

[self.operationQueue addOperationWithBlock:^{
    //Make another request, according to the next instuctions?
}];

通过这种方式,您发送同步的 NSURLRequest 并可以处理错误情况,包括完全退出并重新开始(调用 -cancelAllOperations 的行)。这些请求将一个接一个地执行。

您当然也可以编写自定义 NSOperation 子类并将这些子类的实例排入队列,而不是使用 block ,如果这对您有用的话。

希望对您有所帮助,如果您有任何问题,请告诉我!

关于ios - 排队 NSURLRequest 以模拟同步的阻塞请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147512/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap