Как перейти к блоку завершения метода Objective-C?

Возьмем этот метод в качестве примера:

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion

Достаточно просто использовать другую или модифицированную реализацию самого метода animatedWithDuration:animations:completion:. Что, если вместо этого я захочу сделать это для блока завершения?


person Michael Teper    schedule 12.05.2015    source источник
comment
Swizzling, насколько я понимаю, не сработает, потому что у вас нет селектора для работы. Можете ли вы привести пример того, чего вы хотите достичь?   -  person Phillip Mills    schedule 13.05.2015


Ответы (2)


Как указывали другие, «swizzle» используется для обозначения изменения реализации метода, поэтому у вас неправильный термин, но это не важно.

Я предполагаю, что вы хотите сделать следующее: передать блок animatedWithDuration:animations:completion:, отличный от того, который предоставляет вызывающий; или оберните блок, предоставленный вызывающей стороной, в свой собственный блок, что почти то же самое.

Если моя догадка верна, вы можете изменить метод, заменив его на тот, который вызывает исходные блоки передачи по вашему выбору, которые могут быть обертками вокруг блоков, предоставленных вызывающей стороной.

ХТН

person CRD    schedule 12.05.2015
comment
Это звучит правильно. Не могли бы вы указать мне пример обертывания блока? Допустим, начальный блок делал X, Y и Z, и ради этого примера я хотел дополнить это вызовом NSLog(@"Done!") - person Michael Teper; 13.05.2015
comment
@MichaelTeper - может быть, использование обертки предложило что-то особенное, но это не так. Вы знаете о свизлинге. В вашем методе, который заменяет метод и вызывает исходный проход в качестве блока продолжения к оригиналу, блок, который сначала вызывает блок, предоставленный вызывающей стороной, а затем вызывает NSLog, то есть блок, который обертывает предоставленный вызывающей стороной. - person CRD; 13.05.2015

Swizzling относится к изменению метаданных класса или объекта, чтобы вызвать другую реализацию для данного селектора. (Это очень хрупкий и несколько опасный метод, которого следует избегать в производственном коде, если только вы не очень хорошо осведомлены о том, что делаете, а если и знаете, вы, вероятно, все равно будете его избегать. он блестяще взрывается и делает код невероятно трудным для понимания.Однако он полезен для отладки и исследования.)

Блок — это значение. Это функциональный литерал, точно так же, как «1» — целочисленный литерал или @"string" — строковый литерал. Нет объекта или класса, который можно было бы использовать. Если вы хотите изменить значение, вы должны изменить значение точно так же, как вы изменили бы продолжительность в своем примере.

person Rob Napier    schedule 12.05.2015