Xcode自动完成块内块(以及它们所在的块......)

时间:2018-02-22 16:12:33

标签: objective-c xcode objective-c-blocks

如何设置一个块属性,将另一个块属性作为参数,以便自动完成为两个块提供所有必需参数?

为了进一步解释,我将演示自动完成如何仅使用一个块属性。

AppDelegate.h中,为需要访问块属性的所有类创建一个方便的方法来引用AppDelegate类:

#define AppServices ((AppDelegate *)[[UIApplication sharedApplication] delegate])

然后,定义块:

typedef void (^LogEvent)(NSString *context, NSString *entry, LogTextAttributes logTextAttributes, dispatch_block_t block);

然后,将块指定为属性:

@property (copy, nonatomic, readwrite) LogEvent logEvent;

在AppDelegate.m中,编写一个返回??? n的方法(我不知道我究竟要返回什么;我只知道它有效 - 它是一个块:

- (LogEvent)logEvent
{
    return ^(NSString *context, NSString *entry, LogTextAttributes logTextAttributes, dispatch_block_t block) {
       ...task A...
       block();
    };
}

在另一个类文件中,导入包含块属性的标头:

#import "AppDelegate.h"

然后,开始键入LogEvent块属性的名称(logEvent),并让自动完成填写所需的参数:

AppServices.logEvent(<#NSString *context#>, <#NSString *entry#>, <#LogTextAttributes logTextAttributes#>, <#^(void)block#>)

要使用它,您必须用占位符替换实际值,并且必须将块替换为:

^{ ...block... }

以下是现实场景中的示例:

AppServices.logEvent([NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__], @"Starting network service browser...", LogTextAttributes_Operation, ^(){
    ...task B...
    });

这将做的是执行任务A,然后执行任务B.我想要做的是定义两个块,将两者都指定为属性,然后将一个作为参数添加到另一个;然后,当我输入接受另一个作为参数的块的名称时,我希望Xcode自动完成它们的所需参数。例如:

对于一个名为RunTask的块属性,它将一个名为dispatch_block_t的{​​{1}}作为参数,我希望,使用相同的设置,键入block会产生这个:

RunTask

因此,如果RunTask(<#^(void)block#>) 类型定义的dispatch_block_t block参数替换为LogEvent

RunTask

然后,Xcode会像这样自动完成 void (^LogEvent)(..., RunTask runTask);

LogEvent

顺便说一下,如何使用LogEvent的原始dispatch_block_t参数来实现自动完成,然后阻塞参数,例如,dispatch_async:

AppServices.logEvent(..., ^{ ...task B... });

当您键入dispatch_async时,Xcode会为两个必需参数提供占位符。如果按Tab键两次,则block(last)参数以蓝色突出显示;如果按Return键,则会发生这种情况:

dispatch_async(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)

块语句占位符变为块语句,块内有代码占位符。我想知道怎么做......

0 个答案:

没有答案