草庐IT

grand-central-dispatch

全部标签

iphone - 在添加到 View 之前在后台线程中更新 UI 元素

我只是想围绕大中央调度(GCD)进行思考,但我似乎无法找到答案所以我知道,通常您不应该从主线程以外的任何线程更新UIView元素。所以这是非法的:dispatch_async(workerQueue,^{self.view.backgroundColor=[UIColorredColor];});但是你可以在View元素实际添加到View之前对其进行处理吗?换句话说,这是允许的吗?dispatch_async(workerQueue,^{UIButton*thisLevelButton=[UIButtonbuttonWithType:UIButtonTypeCustom];thisLe

ios - 在 GCD 中,何时使用全局并发队列与自定义并发队列?

在GCD中,有两种方法可以同时运行block。我可以使用其中一个全局池:DispatchQueue.global().async(){//dowork}或者我可以创建自己的队列:letqueue=DispatchQueue(label:"processimages",attributes:[.concurrent])queue.async{//dowork}但我找不到太多关于何时更喜欢其中一个的信息。有些地方(包括来自libdispatch维护者的邮件列表帖子的this摘要)建议您真的不应该使用全局队列。然而,大多数代码示例只是分派(dispatch)到一个全局队列,甚至有一些消息来源

ios - 返回一个 dispatch_async 获取的变量

这个问题在这里已经有了答案:Returnvalueforfunctioninsideablock(3个答案)关闭9年前。基本上:方法需要返回在dispatch_async中获取的NSDictionary。这是我尝试过的:-(NSDictionary*)fetchNSDictionary{dispatch_queue_tQueue=dispatch_queue_create("Dictionaryfetcher",NULL);dispatch_async(Queue,^{NSDictionary*dict=...dispatch_async(dispatch_get_main_queue

ios - heightForImageCellAtIndexPath 中 dispatch_once 的原因

当我搜索如何在iOS中实现自动调整单元格大小时,我遇到了许多示例(herehere和here),在-(CGFloat)heightForImageCellAtIndexPath:(NSIndexPath*)索引路径staticCommentedItemCell*sizingCell=nil;staticdispatch_once_tonceToken;dispatch_once(&onceToken,^{sizingCell=[self.tableViewdequeueReusableCellWithIdentifier:kCellIdentifier];});但是我找不到这个disp

ios - 使用 dispatch_block 崩溃

我一直在努力了解这次崩溃背后的原因,以便更多地了解block的行为方式。我有一个非常简单的类来触发这次崩溃。@implementationBlockCrashTest-(void)doSomething{dispatch_queue_tqueue=dispatch_queue_create("com.queue.test",DISPATCH_QUEUE_SERIAL);__weaktypeof(self)weakSelf=self;dispatch_block_tblock=^{__strongtypeof(weakSelf)strongSelf=weakSelf;dispatch_g

objective-c - 在不同的托管对象上下文中看不到 ios coredata 更新 - 上下文之间的数据不同

我们遇到了这个问题,不同的线程在相同的记录上看到不同的数据,但具有不同的托管对象上下文(moc)。我们的应用程序在后台同步到服务器API。所有的同步都是在它自己的线程上完成的,并使用它自己的moc。然而,我们发现当数据在主moc上更新时,数据的变化不会显示在后台moc中。任何想法可能会发生什么?这里有一些更多的细节:我们正在使用像这样的大中央调度来将同步操作放在它自己的线程上:我们已经检查了哪些队列正在运行,并且这一切都发生在预期的队列上。-(void)executeSync;{dispatch_async(backgroundQueue,^(void){if([selfisDebug

ios - NSURLConnection 在另一个线程中启动。未调用委托(delegate)方法

我在另一个线程中启动了一个NSURLConnection:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{NSURLConnection*connection=[NSURLConnectionconnectionWithRequest:[requestpreparedURLRequest]delegate:self];[connectionstart];});但是我的委托(delegate)方法没有被调用:-(void)connection:(NSURLConnection*)conn

ios - 您可以查询 GCD 串行队列以获取待处理任务的数量吗?

我正在接管一个客户应用程序的所有权,该应用程序由客户的一位刚接触iOS开发的员工(后来离开了公司)编写我正在尝试处理/改进它对并发的使用。它创建了一堆具有不同延迟的不同GCD计时器,而且计时一团糟。我可能会将其转换为使用GCD串行队列,因为我需要按顺序运行任务(但不是在主线程上)。我想监控待处理任务的深度在队列中。NSOperationQueues有一个查看挂起任务数量的工具,但我没有看到GCD串行队列的类似选项。有这样的设施吗?我想我可以构建一个NSOperationQueue,并使每个操作都依赖于前一个操作,从而创建一个串行操作队列,但是仅仅诊断任何时候队列中的任务数量就需要大量工

ios - +[NSObject initialize] 内部的 dispatch_once 是否矫枉过正?

如果我在+[NSObjectinitialize]中创建一个单例,我是否需要像这样将我的代码放在dispatch_onceblock中?staticNSObject*Bar;@implementationFoo+(void)initialize{if(self==[Fooclass]){staticdispatch_once_tonceToken;dispatch_once(&onceToken,^{Bar=[NSObjectnew];});}}@end编辑我很担心这一点,因为我想确保在调用+[Fooinitialize]后所有线程都能看到我设置了Bar。文档说+[NSObjectin

ios - 使用 dispatch_sync 作为互斥锁

这是我需要做的。我希望dispatch_sync是使用GCD的最佳方式我在Appdelegate的applicationDidBecomeActive回调中有一段临界区代码..我将该方法包装在一个dispatch_sync调用中,这样无论applicationDidBecomeActive被调用多少次,它都只会被调用一次-(void)applicationDidBecomeActive:(UIApplication*)application{dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0