Effective Objective-C(第41-46条)gcd大中枢派发、performSelector

    OC中多线程编程的核心就是block与gcd。这虽然是两种不同的技术,但他们是一并引入的。block是一种可在C、C++及OC代码中使用的“词法闭包”(lexical closure),它极为有用,借此机制,开发者可将代码像对象一样传递,令其在不同环境(context)下运行。在block的范围内,它可以访问到其中的全部变量。

    gcd是一种与block有关的技术,它提供了对线程的抽象,而这种抽象基于“派发队列”(dispatch queue)。开发者可将block排入队列中,有gcd负责处理所有调度事宜。gcd会根据系统资源情况,适时得创建、复用、摧毁后台线程,以便处理每个队列。此外,使用GCD还可以方便的完成常见编程任务,比如编写“只执行一次的线程安全代码”(thread-safe single-code execution),或者根据可用的系统资源来并发执行多个操作。

    block和gcd是当前OC的编程基石。因此必须理解其工作原理及功能

第41条:多用派发队列,少用同步锁

   在OC中,如果有多个线程要执行同一份代码,那么有时候可能会出问题。一般采用锁来实现某种同步机制。在GCD出现之前,第一种是采用“同步Block”,另一个办法是使用NSLock对象。这两种都会遇到死锁现象。使用gcd,它能以简单、高效的形式为代码枷锁。

    “串行同步队列”(serial synchronization queue)。将读取/写入都安排在同一个队列里,即可保证数据同步。

_syncQueue = dispatch_queue_create("com.effective-c.syncQueue",NULL);
-(NSString*) someString {
    __block NSString* localSomething;
    dispatch_sync(_syncQueue,^{
        localSomeString = _someString;
    });
    return localSomeString
}
-(void) setSomeString:(NSString*) someString{
    dispatch_sync(_syncQueue,^{
        _someString = someString;
    });
}

    此模式的思路是:把设置操作与获取操作都安排在序列化的队列里执行,这样的话,所有的针对属性的访问都是同步了。这点很想symbian的多动对象(OA)

    读、写操作。前者可以并发读取,但是后者不能并发。可以优化代码如下:

_syncQueue = dispatch_get_global_create("DISPATCH_QUEUE_PRIORITY_DEFAULT",NULL);
-(NSString*) someString {
    __block NSString* localSomething;
    dispatch_sync(_syncQueue,^{
        localSomeString = _someString;
    });
    return localSomeString
}
-(void) setSomeString:(NSString*) someString{
    dispatch_barrier_async(_syncQueue,^{
        _someString = someString;
    });
}

    其中dispatch_barrier_async是栅栏,在队列中,栅栏块必须单独执行,不能与其他块并行。如图所示:


第42条:多用gcd,少用performSelector系列方法

【本节要点】

● performSelector系列方法存在内存管理方面容易有疏忽。它无法确定将要执行的选择子具体是什么,因而ARC编译器也就无法插入适当的内存管理方法。

● performSelector系列方法能处理的选择子太过局限了,选择子的返回值类型及发送给方法的参数个数都有限制。

● 如果想把任务放到另一个线程上执行,那么最好不要用performSelector系列方法,而是使用gcd实现。

第43条:掌握gcd及操作队列的使用时机

    很少有其他技术能与gcd的同步机制相媲美。对于那些只需要执行一次的代码来说,也是如此,使用gcd的dispatch_once最为方便。然而在执行后台任务时候,gcd并不一定是最佳方式。还有一种技术叫做NSOpertationQueue,它虽然与gcd不同,但是却与之相关,开发者可以把操作以NSOpertation子类的形式放到队列中,这些操作也能够并发执行。

    在两者差别中,首先要注意:gcd是纯c的API,而操作队列是OC对象。gcd处理轻量级block而操作队列处理重量级OC对象。

    用NSOperationQueue类的addOperatonWithBlock方法搭配NSBlockOperation类来操作队列,其语法与纯gcd方法非常类似。使用NSOperation和NSOpertaionQueue的好处如下:

● 取消某个操作

● 指定操作间的依赖关系

● 通过键值观测机制监控NSOperation属性。

● 指定操作的优先级

● 重用NSOperation对象。

操作队列很多地方胜过派发队列。操作队列提供了很多执行任务的方法,而且都是写好了,直接就能用。开发者不用再编写复杂的调度器。

NSNotificationCenter使用了操作队列

本节要点

● 在解决多线程与任务管理问题时,派发队列并非唯一方案。

● 操作队列提供了一套高层次的OC API。能实现纯gcd所具备的绝大部分功能,而且还能完成一些更为复杂的操作,那些操作如果该用gcd来实现,则需要另外写代码。

第44条:通过dispatch group机制,根据系统资源状况来执行任务

(带补充)

第45条:使用dispatch_once来执行只需运行一次的线程安全代码

直接看代码吧,通常是单例的实现。

+(id) sharedInstance{
    static EOCClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{sharedInstance = [[self alloc]init];});
return sharedInstance;
}

第46条:不要使用dispatch_get_current_queue

-(NSString*) someString {
    __block NSString* localSomething;
    dispatch_sync(_syncQueue,^{
        localSomeString = _someString;
    });
    return localSomeString
}
-(void) setSomeString:(NSString*) someString{
    dispatch_sync(_syncQueue,^{
        _someString = someString;
    });
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Objective-C的forward按钮代表了一个向前的按钮,用于在视图控制器进行导航操作。在iOS应用程序,导航栏通常使用导航控制器来管理多个视图控制器之间的导航流程。forward按钮是导航栏上的一个图标按钮,当用户点击该按钮时,它会在导航控制器将当前视图控制器推出栈并显示下一个视图控制器。 通过forward按钮,用户可以在应用程序的不同页面之间进行快速切换和导航操作。这方便了用户在应用程序进行不同页面的浏览和交互。例如,在一个新闻应用程序,forward按钮可以用于在不同的新闻文章之间进行切换。用户可以通过点击forward按钮轻松地浏览不同的新闻文章,而不需要返回到列表页面再选择下一篇文章。 在Objective-C,使用forward按钮需要在对应的视图控制器添加相应的事件处理方法。通过实现该事件处理方法,可以定义forward按钮点击后的具体导航操作或其他逻辑。例如,在事件处理方法可以使用导航控制器的pushViewController方法将下一个视图控制器推入栈并显示在屏幕上。 总之,Objective-C的forward按钮是一种用于导航控制器进行页面切换和导航操作的交互元素。它可以帮助用户快速切换页面,提升应用程序的用户体验和导航效率。 ### 回答2: Objective-C的forwardButton是一个用于处理按钮点击事件的方法,它允许开发者自定义按钮的行为和逻辑。 在Objective-C,我们通常使用UIButton类来创建和使用按钮。当用户点击按钮时,系统会调用按钮的事件处理方法,例如`buttonClicked:`。但是有时候我们可能需要在按钮点击事件被触发之前,执行一些自定义的逻辑。这时就可以使用forwardButton方法。 forwardButton方法是一个用于处理按钮点击事件的间方法。它被系统调用时,会首执行一些自定义的逻辑,然后再转发(forward)按钮点击事件到相应的处理方法,例如`buttonClicked:`。这样就可以在按钮点击事件被处理前,执行我们自己定义的一些逻辑。 使用forwardButton方法的步骤如下: 1. 在需要使用forwardButton方法的类,定义一个名为forwardButton的方法,并设置其参数为按钮对象。 2. 在forwardButton方法,编写自己需要执行的逻辑。这些逻辑可以是与按钮点击事件相关的任意操作,例如改变按钮的颜色、改变界面的显示等。 3. 在forwardButton方法,使用performSelector方法来调用相应的按钮处理方法,例如`[self performSelector:@selector(buttonClicked:) withObject:button]`。注意要确保按钮处理方法存在,并且与forwardButton方法的参数一致。 4. 在按钮点击事件发生时,系统会自动调用forwardButton方法,然后再转发到相应的按钮处理方法,实现我们的自定义逻辑。 总之,Objective-C的forwardButton方法提供了一种灵活的方式来自定义按钮的行为和逻辑。通过在forwardButton方法编写自己的代码,可以在按钮点击事件处理前执行一些自定义操作,从而实现更加个性化的按钮行为。 ### 回答3: Objective-C 的 forward button(前进按钮)是一种 UI 元素,用于在应用程序或浏览器导航到下一个页面、屏幕或视图。它通常显示为一个箭头图标,并放置在界面的左侧或右侧。 forward button 的主要作用是方便用户快速导航到下一个所需页面。用户可以点击该按钮,从当前页面跳转到下一个页面,从而加快应用程序或网页的使用效率。它尤其在浏览器经常使用,用户可以通过 forward button 快速返回到之前访问过的页面。 在 Objective-C ,可以通过以下方式来实现 forward button: 1. 创建 UIButton 实例,并设置按钮的图像为前进箭头图标。可以使用系统提供的箭头图标,也可以使用自定义的图标。 2. 将按钮添加到应用程序的视图层次结构,可以通过 addSubview 方法添加到父视图。 3. 为按钮添加一个点击事件,比如 addTarget:action:forControlEvents: 方法,当用户点击按钮时执行相应的操作。例如,可以使用 forward 方法导航到下一个页面或视图。 4. 根据需求,可以为按钮设置其他属性,如按钮的位置、大小、颜色等。 5. 在需要展示 forward button 的界面,将该按钮可见,对应的页面已提供返回功能的页面即可展示 forward button。 总之,Objective-C 的 forward button 是一种方便用户导航到下一个页面的 UI 元素。它可以帮助用户快速跳转到下一个所需的视图或页面,提高应用程序或网页的用户体验。通过使用 UIButton 创建、设置和处理点击事件,可以在 Objective-C 的应用程序轻松实现 forward button 功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值