如何设置一个块属性,该属性将另一个块属性作为参数,以便自动完成功能为两个块提供所有必需的参数?
为了进一步解释,我将演示自动完成功能如何仅适用于一个块属性。
In AppDelegate.h
,为所有需要访问 block 属性的类创建一个引用 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 替换为:
^{ ...block... }
以下是现实场景中的示例:
AppServices.logEvent([NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__], @"Starting network service browser...", LogTextAttributes_Operation, ^(){
...task B...
});
这将执行任务 A,然后执行任务 B。我想要做的是定义两个块,将它们指定为属性,然后将一个块作为参数添加到另一个块;然后,当我输入接受另一个作为参数的块的名称时,我希望 Xcode 自动完成它们所需的参数。例如:
对于名为的块属性RunTask
它需要一个参数作为参数dispatch_block_t
named block
,我希望在相同的设置下,输入RunTask
会产生这个:
RunTask(<#^(void)block#>)
所以,如果dispatch_block_t block
的参数LogEvent
类型定义被替换为RunTask
:
void (^LogEvent)(..., RunTask runTask);
然后,Xcode会自动完成LogEvent
像这样:
AppServices.logEvent(..., ^{ ...task B... });
顺便说一句,如何使用 LogEvent 的原始dispatch_block_t参数,自动完成将执行与dispatch_async的then块参数相同的操作:
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
当您输入dispatch_async时,Xcode会为两个必需参数提供占位符。如果按两次 Tab 键,块(最后一个)参数将以蓝色突出显示;如果按 Return 键,则会发生以下情况:
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, ^{
<#code#>
})
块语句占位符变成块语句,块内有代码占位符。我想知道该怎么做...