grand-central-dispatch
全部标签 我正在阅读OReilly的iOS6ProgrammingCookbook并且对某些事情感到困惑。引自第378页,第6章“并发”:对于任何不涉及UI的任务,您可以在GCD中使用全局并发队列。这些允许同步或异步执行。但同步执行并不意味着您的程序在继续之前等待代码完成。它只是意味着并发队列会等到你的任务在它之前完成继续队列中的下一个代码块。当您将block对象放在并发队列,您自己的程序总是立即继续,而无需等待执行代码的队列。这是因为并发队列,顾名思义,在主线程以外的线程上运行他们的代码。我将引起我兴趣的文字加粗了。我认为这是错误的,因为正如我今天刚刚了解到的那样,同步执行恰恰意味着程序在继续
在研究iOS中的后台任务后,我试图完全理解我放在一起的以下代码,希望能得到一些帮助,我理解基本概念,首先我们获取应用程序单例,然后我们创建一个block并向系统注册后台任务,最后我们异步调度任务运行。下面是我正在寻求帮助的部分:当background_task被分配block时,实际block中没有我们想要运行的代码,只有完成处理程序中的清理代码,这是为什么?我理解dispatch_async基本上启动了一个新线程并开始处理block中的代码,但是在这个dispatch_async请求中哪里引用了background_task?我看不出系统是怎么理解我们在dispatch_async请
我有很多这样的代码:dispatch_async(dispatch_get_global_queue(0,0),^{});dispatch_async将在我调用一次时创建一个新线程。当应用程序运行一段时间后,我得到了很多线程:数字50、60、70。这不是很好。如何重用这些线程。喜欢tableview.dequeueReusableCellWithIdentifier这是我的代码。下载后需要做一些图片拼接,然后保存。-(void)sdImageWith:(NSString*)urlStringsaveIn:(NSString*)savePathcompletion:(completion
在iOS11之前,我能够动态地重新加载TableView数据,而无需将重新加载分派(dispatch)到主线程。但是,现在我正在安装了iOS11的设备上进行测试,似乎我必须将每个UI更新分派(dispatch)到主线程才能使其正常工作。否则我最终会得到空的UI元素。即具有所有行但没有标签的TableView,或没有标题的按钮等。有谁知道iOS11中发生了什么变化要求这样做?有办法关闭它吗? 最佳答案 从远古时代开始,Apple就强调所有与UI元素的交互必须发生在主/GUI线程上。不听从这个建议会导致奇怪的行为:有时它会工作正常,其他
我想从不同的url获取许多图像并将其设置为图像的按钮。我试图像上面显示的那样执行此操作,但没有任何反应。当我访问这个ViewController时,它没有任何按钮图像,也没有显示横幅View...。dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^(void){NSURL*url=[NSURLURLWithString:[pictureUrlobjectAtIndex:i]];NSData*data=[[NSDataalloc]initWithContentsOfURL:url];d
我正在开发一个基于网络的iOS应用程序,它从服务器下载json数据并进行处理。下载任务和处理任务都需要很长时间才能完成,所以我不想在主线程上执行。我认为有两种方法可以做到这一点:使用NSURLConnection执行异步加载,并在didFinishLoading方法中使用GCD(比方说)在后台进行处理。使用GCDdispatch_async(比方说)在后台开始工作并使用NSURLConnectionsendSynchronousRequest:returningResponse:error同步下载数据,对数据进行处理,并在主线程调用UI更新。我认为第二种方法更容易编写并且会产生更清晰的
我已经创建了一些示例代码来演示我的问题。-(void)test{void(^handler)(void)=^{NSArray*test=[NSArrayarray];[testobjectAtIndex:5];};handler=[handlercopy];dispatch_async(dispatch_get_main_queue(),handler);}当我调用测试方法时,我没有得到堆栈跟踪。调试器停在main.m并突出显示此行intretVal=UIApplicationMain(argc,argv,nil,NSStringFromClass([FantasyUniversalA
我使用GCD在UIWebView中运行javascript,当它是正常的javascipt时,一切似乎都找到了,但是当涉及到“警报”时,弹出模态视图使我的用户界面变得无响应。这是我在UIWebViewDelegate方法中的代码。-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType{NSLog(@"RECEIVED");BOOLre=[WebParserStrateg
我有一组对象,由ViewController初始化和拥有。ViewController在每个对象中启动一个fetchData方法,该方法在后台线程中运行,然后在完成后返回主线程并更改属性-self.dataFetchComplete,ViewController正在观察它。dispatch_async(dispatch_get_main_queue(),^{self.dataFetchComplete=YES;});如果在使用此方法完成这些对象之前释放ViewController,则当它到达self.dataFetchComplete=YES;行时,它会崩溃。在解除分配后尝试更改此属性
在GCD中,有没有办法判断当前队列是否并发?我目前正在尝试对某些托管对象上下文执行延迟保存,但我需要确保当前执行代码的队列是线程安全的(在同步队列中)。 最佳答案 如果您实际上必须确定传递给您的队列是串行的还是并发的,那么几乎可以肯定您的设计有误。通常,API会将内部队列隐藏为实现细节(在您的情况下为共享对象上下文),然后针对其内部队列对操作进行排队,以实现线程安全。但是,当您的API将block和队列作为参数时,假设传入的block可以针对传递的队列安全地调度(异步)(例如,当操作完成时)和其余部分代码被适当分解。