Tag: objective c blocks

实现一个块作为callback使用的方法

我想写一个类似这样的方法: +(void)myMethodWithView:(UIView *)exampleView completion:(void (^)(BOOL finished))completion; 我已经基本上从苹果的UIView的类方法剥离的语法: + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; 并期望它被使用像这样: [myFoo myMethodWithView:self.view completion:^(BOOL finished){ NSLog(@"call back success"); }]; 我的问题是我怎样才能实现呢? 如果有人能指出我的正确的文档,那将是非常好的,一个非常基本的例子将不胜感激(或堆栈溢出类似的答案 – 我找不到一个)。 对代表们来说,我还不是很了解,以确定这是否是正确的做法! 我已经把我期望它在实现文件中的一个粗略的例子,但是因为我不能find信息这是猜测工作。 + (void)myMethod:(UIView *)exampleView completion:(void (^)(BOOL finished))completion { // do stuff if (completion) { // what sort of syntax goes here? If I've constructed this […]

自定义完成块为我自己的方法

我刚刚发现完成块: completion:^(BOOL finished){ }]; 我需要做什么来让我自己的方法采取完成块?

将块内的variables分配给块外的variables

我收到一个错误 variables不可分配(缺less__blocktypes说明符) 在线aPerson = participant; 。 我怎样才能确保块可以访问aPersonvariables和aPersonvariables可以返回? Person *aPerson = nil; [participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Person *participant = (Person*)obj; if ([participant.gender isEqualToString:@"M"]) { aPerson = participant; *stop = YES; } }]; return aPerson;

何时使用enumerateObjectsUsingBlock与for

除了明显的区别之外: 当你需要索引和对象时,使用enumerateObjectsUsingBlock 当你需要修改局部variables时,不要使用enumerateObjectsUsingBlock (我错了,请看bbum的答案) 是否enumerateObjectsUsingBlock一般认为更好或更糟的时候for (id obj in myArray)也将工作? 有什么优点/缺点(例如,它或多或less的性能)?

“__block”是什么意思?

Objective-C中的__block关键字是什么意思? 我知道它允许你修改块内的variables,但我想知道… 究竟是什么告诉编译器? 它做了什么吗? 如果是这样,那么为什么它需要摆在首位呢? 它在任何地方的文档? (我找不到)。

如何在执行API时避免在块中捕获自己?

我有一个工作的应用程序,我正在将其转换为Xcode 4.2中的ARC。 其中一个预先检查的警告涉及在一个导致保留周期的块中强烈地捕获self 。 我已经做了一个简单的代码示例来说明问题。 我相信我明白这意味着什么,但我不确定实施这种情况的“正确”或推荐的方式。 self是类MyAPI的一个实例 下面的代码被简化为只显示与我的问题相关的对象和块的交互 假设MyAPI从远程源获取数据,MyDataProcessor使用该数据并生成输出 处理器configuration有块来传输进度和状态 代码示例: // code sample self.delegate = aDelegate; self.dataProcessor = [[MyDataProcessor alloc] init]; self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete]; }; self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil; }; // start the processor – processing happens asynchronously and the processor is released in the […]