float pi = 3.14;
float (^piSquare)(void) = ^(void){ return pi * pi; };
float (^piSquare2)(void) = ^(void){ return pi * pi; };
[piSquare isEqualTo: piSquare2]; // -> want it to behave like -isEqualToString...
Run Code Online (Sandbox Code Playgroud) 我有一个符合NSFilePresenter协议的对象,该协议代表我基于文档的应用程序文档包.当在包内创建一个新文件时,要么以编程方式使用NSFileManager和正确的NSFileCoordination方法,要么通过Finder我只得到-presentedSubitemDidChangeAtURL:
事件,但在这种情况下看起来并不那么明显-presentedSubitemDidAppearAtURL:
.
这是预期的行为还是我做错了什么?
-presentedSubitemDidAppearAtURL:
NSFilePresenter中的评论明确指出:
通知已添加目录包含的文件或目录.如果此方法未实现但是
-presentedItemDidChange
,并且该目录实际上是文件包,则文件协调机制将调用-presentedItemDidChange
.
想象一下以下情况:你有一个后台任务(术语"任务"在这里意味着一个随机计算单元,而不是NSTask!),它是使用任何现代技术实现的,例如Grand Central Dispatch或Operation Queues.主线程上的某些控制器对象想要监视此后台任务的进度并将其报告给用户.
任务进度可以具有以下特征:
什么设计最适合这些要求,同时也是最可可的?
在启动任务之前,将控制器对象设置为委托.
@protocol MyBackgroundTaskDelegate
@required
- (void) progress: (float) value; // 0.0…1.0
@optional
- (void) workingOn: (NSString*) msg; // @"Doing this, doing that…"
@end
Run Code Online (Sandbox Code Playgroud)
实际上,我成功地使用了这个模板很多次,但感觉有点过于冗长.
与委托非常相似,但将代码保存在一个地方.
// Starting our background task...
[MyTask startComputationWithProgressHandler: ^(float progress, NSString* msg)
{
// Switching to the main thread because all UI stuff should go there...
dispatch_async(dispatch_get_main_queue(), ^()
{
self.progressIndicator.progress = progress;
self.informationalMessage = msg;
});
}];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,后台任务对象必须具有两个类似于以下的属性: …
cocoa multithreading key-value-observing grand-central-dispatch