Các MonoTouch docs chỉ ra rằng bản đồ phương pháp để chọn obj-C performSelector:withObject:afterDelay
, mà chỉ hỗ trợ cách gọi một selector với một đối số duy nhất.
Cách tốt nhất để xử lý việc này phụ thuộc vào những gì bạn cần làm. Một cách điển hình để xử lý điều này là đặt các đối số là các thuộc tính/trường vào một NSObject đơn lẻ, sau đó đích sẽ được sửa đổi để có một đối số duy nhất và kéo các đối số thực ra khỏi phương thức đó. Nếu bạn đã làm điều này với một đối tượng MonoTouch tùy chỉnh, bạn sẽ phải xem ra cho GC thu thập các peer được quản lý, nếu không có gì trong quản lý mã giữ một tham chiếu đến nó.
Giải pháp tốt hơn sẽ phụ thuộc vào chính xác cách bạn đang sử dụng. Ví dụ: trong ví dụ của bạn, bạn có thể trực tiếp gọi phương thức C#, ví dụ:
_HandleSaveButtonTouchUpInside (url, data);
Nếu bạn cần phải gửi qua obj-C đối với một số lý do, nhưng không cần sự chậm trễ, sử dụng MonoTouch.ObjCRuntime.Messaging, ví dụ
MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (
target.Handle,
MonoTouch.ObjCRuntime.Selector.GetHandle ("_HandleSaveButtonTouchUpInside"),
arg0.Handle,
arg1.Handle);
Nếu bạn cần sự chậm trễ, bạn có thể sử dụng NSTimer. MonoTouch đã thêm hỗ trợ đặc biệt cho việc này để sử dụng một đại biểu NSAction, vì vậy bạn có thể sử dụng C# lambda để nắm bắt các đối số một cách an toàn.
NSTimer.CreateScheduledTimer (someTimespan,() => _HandleSaveButtonTouchUpInside (url, data));
Nguồn
2012-05-07 02:59:11
Cảm ơn bạn đã trả lời kỹ lưỡng mhutch. Tôi đã sử dụng PerformSelector khi tôi cần giải phóng chủ đề chính sao cho ca cao sẽ vẽ lại màn hình, và sau đó tôi có thể quay lại xử lý một số logic. Ngay bây giờ tôi đang cố gắng để cập nhật tương đương với một thanh tiến trình đã được rút ra màn hình trong một writeStream cho vòng lặp mà tôi có. Muốn xem nếu tôi về cơ bản có thể làm mới màn hình bằng cách đặt một bộ chọn thực hiện trong vòng lặp và cập nhật thuộc tính của thanh tiến trình. –
Một cách khác để thực hiện điều đó là sử dụng luồng cho luồng/luồng và sử dụng InvokeOnMainThread từ chuỗi để cập nhật giao diện người dùng. –
Điều này đã giúp tôi không phải tự rebind một thư viện vì nhà phát triển ban đầu không ràng buộc một thuộc tính cụ thể hoặc phát hành nguồn, vì vậy cảm ơn bạn. Đối với bất kỳ ai quan tâm, các thuộc tính có thể dễ dàng được thiết lập bằng cách sử dụng phương thức msgSend_IntPtr_IntPtr bằng cách gọi setColor: nơi màu là tên của thuộc tính. (Arg 0 là giá trị tài sản, Arg 1 = IntPtr.Zero) – Dermot