我已经创建了一个类NSURLConnection的包装类,并且类的用户传递了在连接的各个阶段被调用的块。包装类如下所示,为了简洁起见简化:你如何让一个块成为一个班级的成员?
typedef void (^ConnectionFinishedWithErrorBlock)(NSError* error);
@interface MYHTTPConnection : NSObject <NSURLConnectionDelegate>
@property (copy, nonatomic) ConnectionFinishedWithErrorBlock theErrorBlock;
@property (strong, nonatomic) NSURLConnection *connection;
- (void) establishConnectionForURL:(NSURL*) url
andConnectionFinishedWithErrorBlock: (ConnectionFinishedWithErrorBlock) errorBlock;
@end
到目前为止,我已经使用它与联声明即
[self.httpConnection establishConnectionForURL: url
andConnectionFinishedWithErrorBlock:^(NSError* error)
{
...
}];
块被但现在我有一个情况我有一个非常长的错误处理块,并将其所有内联代码放在一起将会变得混乱(因为API需要其他块未在此处显示)。
我知道我可以做这样的事情:
void (^httpConnectionFinishedWithError)(NSError*) =
^(NSError* error)
{
}
然后传递到httpConnectionFinishedWithError establishConnectionForURL。但httpConnectionFinishedWithError包含对自我的调用。当声明内联块时,对自我的调用是正确的,但在完成上述操作时不会发生这种情况,因为显然这会产生编译错误。
所以我想知道是否/如何块可以作为调用类的块属性? (我之前已经将块用作类的属性,正如在上面的MYHTTPConnection类中所做的那样,但在这种情况下,我无法获得将传递给establishConnectionForURL的块添加为属性的语法权限呼叫类)。
或者,httpConnectionFinishedWithError可以调用另一个函数,但在这种情况下,我不得不将自己作为参数传递,在这种情况下如何获得块内的自我?
还有其他更优雅的解决方案吗?
非常感谢
编辑: 更新,以显示实例编译错误的
void (^httpConnectionFinishedWithError)(NSError*) =
^(NSError* error)
{
self.boolProperty = NO; // here
}
«当块被声明为内联时,对自我的调用是正确的,但是当完成上述操作时不会发生这种情况,因为显然这会产生编译错误。»这根本不清楚。你在做什么工作?任何ObjC方法中都有一个有效的自我指针。如果你在类方法中,'self'指向类而不是实例 - 是问题所在? –
是的,它需要访问实例属性和方法。 – Gruntcakes
所以_你在做什么? –