grand-central-dispatch
全部标签 Apple的GrandCentralDispatch(GCD)很棒,但只能在iOS4.0或更高版本上运行。苹果的documentation说,“[A]序列化操作队列不提供与GrandCentralDispatch中的串行调度队列完全相同的行为”(因为队列不是FIFO,但顺序由依赖性和优先级决定)。在支持GCD发布之前的OS版本的同时,如何实现与GCD的串行调度队列相同的效果的正确方法是什么?或者换句话说,在希望支持低于4.0版本的iOS应用程序中处理简单后台处理(执行Web服务请求等)的推荐方法是什么? 最佳答案 这个PseudoS
当我们在block中调用dispatch_async()时,使用@synchronized()的IOS中的锁会发生什么。例如:idmyID-(void)foobar{@synchronized(myID){dispatch_async(){//dostuffwithmyID};}}锁在dispatch_async调用中是否仍然有效?或者更重要的是,在dispatch_async()中使用另一个@synchronized()调用有什么缺点吗? 最佳答案 假设您正在尝试同步与后台队列中的此myID对象的交互,您希望它以相反的方式进行,即
当我们在block中调用dispatch_async()时,使用@synchronized()的IOS中的锁会发生什么。例如:idmyID-(void)foobar{@synchronized(myID){dispatch_async(){//dostuffwithmyID};}}锁在dispatch_async调用中是否仍然有效?或者更重要的是,在dispatch_async()中使用另一个@synchronized()调用有什么缺点吗? 最佳答案 假设您正在尝试同步与后台队列中的此myID对象的交互,您希望它以相反的方式进行,即
在什么情况下您更愿意使用NSOperationQueue而不是GCD?根据我对这两者的有限经验,我认为使用NSOperationQueue您基本上可以控制并发操作的数量。对于GCD,您不能这样做,因为您使用的是队列。除了你可以用多核处理器以某种方式模拟它,尽管我仍然认为没有办法控制它。 最佳答案 NSOperationQueue构建于iOS4的GCD之上。为手头的任务使用最简单的API。衡量它是否是性能问题,然后在需要时重新评估。dispatch_async是较低级别的,通常是C类型的东西(但不限于),适用于一次性和顺序类型的交易。
在什么情况下您更愿意使用NSOperationQueue而不是GCD?根据我对这两者的有限经验,我认为使用NSOperationQueue您基本上可以控制并发操作的数量。对于GCD,您不能这样做,因为您使用的是队列。除了你可以用多核处理器以某种方式模拟它,尽管我仍然认为没有办法控制它。 最佳答案 NSOperationQueue构建于iOS4的GCD之上。为手头的任务使用最简单的API。衡量它是否是性能问题,然后在需要时重新评估。dispatch_async是较低级别的,通常是C类型的东西(但不限于),适用于一次性和顺序类型的交易。
这是我的问题。当我的应用程序进入后台时,我希望它在一段时间后执行一个功能。这就是我所做的:-(void)applicationDidEnterBackground:(UIApplication*)application{isRunningInBackground=YES;taskIdentifier=[[UIApplicationsharedApplication]beginBackgroundTaskWithExpirationHandler:nil];int64_tdelayInSeconds=30;dispatch_time_tpopTime=dispatch_time(DISP
这是我的问题。当我的应用程序进入后台时,我希望它在一段时间后执行一个功能。这就是我所做的:-(void)applicationDidEnterBackground:(UIApplication*)application{isRunningInBackground=YES;taskIdentifier=[[UIApplicationsharedApplication]beginBackgroundTaskWithExpirationHandler:nil];int64_tdelayInSeconds=30;dispatch_time_tpopTime=dispatch_time(DISP
我是第一次使用Objective-Cblock和操作队列。我正在加载一些远程数据,而主UI显示一个微调器。我正在使用一个完成block来告诉表重新加载它的数据。作为documentationmentions,完成block不在主线程上运行,因此表会重新加载数据但不会重新绘制View,直到您在主线程上执行某些操作(例如拖动表)。我现在使用的解决方案是调度队列,这是从完成block刷新UI的“最佳”方式吗?//defineourblockthatwillexecutewhenthetaskisfinishedvoid(^jobFinished)(void)=^{//Weneedthevie
我是第一次使用Objective-Cblock和操作队列。我正在加载一些远程数据,而主UI显示一个微调器。我正在使用一个完成block来告诉表重新加载它的数据。作为documentationmentions,完成block不在主线程上运行,因此表会重新加载数据但不会重新绘制View,直到您在主线程上执行某些操作(例如拖动表)。我现在使用的解决方案是调度队列,这是从完成block刷新UI的“最佳”方式吗?//defineourblockthatwillexecutewhenthetaskisfinishedvoid(^jobFinished)(void)=^{//Weneedthevie
这段代码dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{NSLog(@"MainThread?%d",[NSThreadisMainThread]);});显示我在主线程中。即使这样做:queue=dispatch_queue_create("nonMainQueue",NULL);仍然报告说我在主队列中。这似乎是becauseI'musingdispatchsync.这是否意味着我的代码与根本不使用dispatch_sync一样?另外:如果dispatch_sync什么都不做,那它还有