我在使用单点触控线程时遇到了一些问题。我的应用程序使用我链接的外部库,它工作正常。由于应用程序和库的性质,我必须在一个单独的线程上进行所有调用。这些调用通常是:
读了一下后,我决定尝试 NSThread 。我已经设法通过将 NSTimer 附加到线程的 RunLoop 来调用Update函数,并且一切正常。我现在遇到的问题是在同一个线程上调用其他方法。我在某处读到 RunLoop 上的 PerformSelector 将选择器调用添加到 RunLoop的队列并在可用时调用它,这基本上就是我的意思需要。但是我需要调用的方法是:
对于多参数问题,我看到 NSInvocation 可以是一个解决方案,但是我的生活中我无法弄清楚如何使用monotouch进行操作并且没有找到任何相关的示例。
对于我需要对库进行的实际调用,我尝试了一种通用的方式,我可以通过特定线程上的委托调用我选择的任何函数,这种方式有效,直到我被多个命中使用多个参数再次参数和/或回调主线程。我是否应该为每个需要从库中调用的(包装)函数注册单独的选择器?
我不喜欢使用这种方法,如果我有更好的方式对它开放,那就是在搜索其他选项后我发现它们不适合我的情况:
我不是iOS开发人员,该应用程序与monodroid工作正常,我有Runnables和Handlers,让生活更轻松:)。也许我没有以正确的方式看待这个问题,并且有一个简单的解决方案。任何意见都将不胜感激。
由于
更新
我正在考虑按照以下方式做点什么: 有一个简单的包装器:
class SelectorHandler : NSObject
{
public static Selector Selector = new Selector("apply");
private Action execute;
public SelectorHandler(Action ex)
{
this.execute = ex;
}
[Register("apply")]
private void Execute()
{
execute();
}
}
延长NSThread
public class Daemon : NSThread
{
public void Schedule(Action action)
{
SelectorHandler handler = new SelectorHandler(action);
handler.PerformSelector(SelectorHandler.Selector, this, null, true);
}
}
然后,当我想打电话时,我可以这样做:
private Daemon daemon;
public void Call_Library_With_Callback(float param, Action<int> callback)
{
daemon.Schedule(() =>
{
int callbackResult = 0;
//Native library calls
//{
// Assign callback result
//}
daemon.InvokeOnMainThread(() =>
{
callback(callbackResult);
});
});
}