У меня два класса. Delegator
использует делегирование для отправки своего результата. Blocker
использует блоки в статических методах.
Без изменения Delegator
, как я могу элегантно и легко реализовать methodWithBlock
, чтобы блок вызывался с результатом, полученным methodWithDelegate
?
Делегатор:
@class Delegator;
@protocol Delegate <NSObject>
- (void)delegator:(Delegator *)sender producedResult:(int)result;
@end
@interface Delegator : NSObject
@property (weak, nonatomic) id <Delegate> delegate;
- (void)methodWithDelegate;
@end
@implementation Delegator
- (void)methodWithDelegate
{
// Some asynchronous computation resulting in
[self.delegate delegator:self producedResult:42];
}
@end
Блокировщик:
@interface Blocker : NSObject
+ (void)methodWithBlock:(void(^)(int result))block;
@end
@implementation Blocker
+ (void)methodWithBlock:(void(^)(int result))block
{
// How to call Delegator's methodWithDelegate and return
// the result using block ?
...
}
@end
Исследуемые решения:
Оберните
Delegator
в новый класс или категорию и создайте метод, возвращающий блок, как это предлагается в этот ответ. Эти решения работают, но слишком сложны и требуют много времени.Заставьте
Blocker
соответствовать протоколуDelegate
и сохраните блок в свойстве, создайте его экземпляр в методеmethodWithBlock
и вызовите блок при вызове метода делегирования. Это не работает, так как нет надежного указателя на этот новый экземпляр, и он уничтожается.В предыдущем решении, чтобы избежать потери экземпляра из-за отсутствия надежного указателя, сохраните статический массив текущих экземпляров
Blocker
и удалите их в методе обратного вызова делегата. Опять же, это решение работает, но слишком сложно.
-methodWithDelegate
, поскольку все в вашем примере кода возвращаетvoid
. - person Jonathan Grynspan   schedule 30.01.2013