草庐IT

非阻塞

全部标签

cocoa-touch - 为什么通过 AV Foundation 播放音频会在慢速连接时阻塞 UI?

我正在使用AVFoundation播放通过网络加载的MP3文件,其代码与此处的播放示例几乎相同:PuttingitallTogether:PlayingaVideoFileUsingAVPlayerLayer,除了没有附加视频播放层。我试图让我的应用程序响应播放缓冲区在慢速网络连接上变空。为此,我计划在AVPlayerItem的playbackBufferEmpty属性上使用键值观察,但文档没有说明这是否可行。我认为这可能是可能的,因为可以观察到status属性(并且是上面的示例),即使文档没有这么说。因此,为了创造缓冲区清空的条件,我在服务器上添加了代码,以便在处理完MP3文件的每个

ios - 线程阻塞 Objective-C

我刚刚阅读thisanswer(答案已被删除)而且我确信我已经看到应用程序在挂起后崩溃,所以我读到的内容是有道理的。IfyoublockthemainthreadfortoolongtheOSwillkillyourapp.但是我写了一些测试,发现在每次等待大约2-5分钟后,没有一个导致应用程序崩溃。断点确认我正在主线程上运行。有人可以证实或反驳我读到的内容,还是我只是选择了很多非阻塞的选项?如果我选择了非阻塞选项,有人可以解释为什么这些选项是非阻塞的吗?while(true){/*Nothing*/}while(true){NSLog(@"nothing");}for(;;);sle

ios - 后台位置的核心数据更新位置导致阻塞 UI

我正在使用3ManagedObjectContextsArchitecture(为父级为managedObjectContext-UI的背景创建临时上下文,并且父级writerObjectContext应该在后台写入数据库)并且我在更新对象时遇到阻塞UI的问题。例子最好。所以我的数据库中有数千个点,我使用NSFetchedResultsController和tableView来获取它们。这是我的代码:-(void)viewDidLoad{[superviewDidLoad];temporaryContext=[[NSManagedObjectContextalloc]initWithC

ios - 为什么不断设置动画的 UIActivityIndi​​cator 不会阻塞主线程?

我们都显示事件指示器,而一些冗长的操作在后台进行。尽管事件指示器显示一个不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕中的其他UIComponents仍会对触摸使用react。我认为我知道的:我知道所有触摸事件都由主线程处理,并且主队列用于对事件进行排队。考虑到主队列是序列化队列,并且在任何给定时间点一次只能运行一个任务,小巷触摸事件应该在主队列中排队,而我的主线程正忙于刷新屏幕/调用UIActivityIndi​​cator的drawrect。研究:我查看了第三方事件指标的代码。他们中的大多数人使用CABasicAnimation并始终在动画上调用repeat。虽然很少有工作

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

我正在与网络控制的硬件设备进行交互。您通过URL(例如、http://device/on?port=1或http://device/off?port=3)打开和关闭东西,它会发回“成功”或“失败”。然而,它是一个简单的设备,因此当它处理一个请求时——即,直到它返回它正在处理的请求的状态——它会忽略所有后续请求。它不会将它们排队;他们只是迷路了。所以我需要发送串行、同步的请求。即,请求#1,等待响应#1,请求#2,等待响应#2,请求#3,等待响应#3,等等。我是否需要管理自己的线程安全请求队列,让UI线程将请求推送到队列的一端,并让另一个线程拉出请求,一次一个,就像前一个一样完成或超时,

ios - webViewDidFinishLoad 阻塞主线程

我刚刚注意到webViewDidFinishLoad方法阻塞了整个应用程序,所以我什至无法触摸任何按钮。我需要解析UIWebView的结果页面,这可能会花费很多时间。那么在不阻塞整个应用程序的情况下解析它的最佳方法是什么?也许创建另一个线程? 最佳答案 使用GCD在后台解析它:-(void)webViewDidFinishLoad:(UIWebView*)webView{//GetthecontentsfromtheUIWebView(inthemainthread)NSString*data=[webViewstringByEva

ios - FMDB 阻塞用户界面。但为什么?对替代实现有什么建议吗?

我有一个使用FMDB并在应用程序启动后立即执行更新(仅一次)的应用程序。更新非常繁重,需要12-20秒来处理。我将FMDatabaseQueue与基于单例类的事务一起使用。========DB.h====================@interfaceDB:NSObject{FMDatabaseQueue*dbqueue;NSArray*queriesCreateSchema;NSString*dbFullPath;}@property(nonatomic,strong)FMDatabaseQueue*dbqueue;================================

ios - 有没有办法让 synchronized 关键字不阻塞主线程

假设您想在iOS应用程序的后台做很多事情,但您对其进行了适当的编码,以便创建线程(例如使用GCD)来执行此后台事件。现在,如果您需要在某个时刻写入更新变量,但此更新可能发生或您创建的任何线程发生,该怎么办。你显然想保护那个变量,你可以使用关键字@synchronized为你创建锁,但这里有问题(摘自Apple文档)The@synchronized()directivelocksasectionofcodeforusebyasinglethread.Otherthreadsareblockeduntilthethreadexitstheprotectedcode—thatis,whene

ios - 在不阻塞 UI 的情况下在 For 循环中添加延迟

在我的UI中,当点击一个按钮时,它会调用一个for循环来顺序执行多个任务。//ForLoopfor(inti=1;i在每个任务之后,我想添加一个用户定义的延迟。例如://ForLoopfor(inti=1;i在iOS中,使用Objective-C,有没有办法在for循环中添加这样的延迟,请记住:UI应保持响应。任务必须按顺序执行。for循环上下文中的代码示例会很有帮助。谢谢。 最佳答案 使用GCDdispatch_after。你可以在stackoverflow上搜索它的用法。不错的文章是hereSwift中延迟1.5秒的简要示例:d

阻塞队列(JAVA)

阻塞队列是一种特殊的队列,也遵守"先进先出"的原则。阻塞队列能是一种线程安全的数据结构,并且具有以下特性:当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素;当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插入元素。 JAVA标准库中已经实现了阻塞队列,我们可以直接进行使用BlockingQueueBlockingQueue是一个接口,阻塞队列也和普通队列一样有两种实现方式:数组和链表。注:创建阻塞队列时需要传入队列的长度参数。BlockingQueuequeue=newArrayBlockingQueue(10);由于 BlockingQueue继承自Queue所以