MonoTouch docs показывает, что метод карта на селектор Obj-C performSelector:withObject:afterDelay
, который поддерживает только ссылающийся селектор с одним аргументом.
Лучший способ справиться с этим зависит от того, что вам нужно делать. Одним из типичных способов справиться с этим было бы поставить аргументы как свойства/поля в одном NSObject, тогда цель будет изменена, чтобы иметь один аргумент, и вытащить реальные аргументы из этого метода. Если вы сделали это с помощью специального объекта MonoTouch, вам нужно будет следить за тем, чтобы GC собирал управляемый одноранговый узел, если ничто в управляемом коде не содержало ссылки на него.
Лучшее решение будет зависеть от того, как вы его используете. Например, в вашем примере вы можете тривиально вызвать метод C# напрямую, например.
_HandleSaveButtonTouchUpInside (url, data);
Если вам нужно послать через Obj-C по какой-то причине, но не нужна задержка, использовать MonoTouch.ObjCRuntime.Messaging, например,
MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (
target.Handle,
MonoTouch.ObjCRuntime.Selector.GetHandle ("_HandleSaveButtonTouchUpInside"),
arg0.Handle,
arg1.Handle);
Если вам нужна задержка, вы могли бы использовать NSTimer. MonoTouch добавила специальную поддержку для использования делегата NSAction, поэтому вы можете использовать C# лямбда для безопасного хранения аргументов.
NSTimer.CreateScheduledTimer (someTimespan,() => _HandleSaveButtonTouchUpInside (url, data));
Благодарим вас за подробный ответ mhutch. Я использовал PerformSelector, когда мне нужно было освободить основной поток, чтобы какао перерисовал экран, а затем я смог вернуться к обработке некоторой логики. Прямо сейчас я пытаюсь обновить эквивалент строки выполнения, которая была нарисована на экране во время цикла writeStream, который у меня есть. Хотел посмотреть, смогу ли я существенно обновить экран, поставив селектор выполнения в цикле for и обновив свойство индикатора выполнения. –
Другой способ сделать это - использовать поток для логики/потока и использовать InvokeOnMainThread из потока для обновления пользовательского интерфейса. –
Это избавило меня от необходимости вручную переписывать библиотеку, потому что первоначальный разработчик не связывал определенное свойство или не выпускал источник, поэтому спасибо. Для всех желающих свойства можно легко установить с помощью метода msgSend_IntPtr_IntPtr, вызвав setColor: где color - это имя свойства. (Arg 0 - значение свойства, Arg 1 = IntPtr.Zero) – Dermot