如何设置一个块属性,将另一个块属性作为参数,以便自动完成为两个块提供所有必需参数?
为了进一步解释,我将演示自动完成如何仅使用一个块属性。
在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#>)
块语句占位符变为块语句,块内有代码占位符。我想知道怎么做......