2013-05-02 37 views
1

我想在Objective-C中实现America's Cup数据流API的库,并且正在环顾四周是否已经存在一个库,并发现了一个implementation in C#,我发现它很漂亮,想借用一些想法从。这是我见过的第一个C#源代码,所以我不完全理解发生了什么。在Objective-C中实现C#事件

以下是使用C#库的示例程序。它启动一个处理网络通信的客户端和一个负责消息分派的FeedEvents。然后会发生一些有趣的事情,看起来像一个lambda表达式被用来指定OnChatterText发生时的动作,对吗?我如何在Objective-C中做到这一点?使用块?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var c = new Client(); 
     var e = new FeedEvents(); 
     e.OnChatterText += ch => Console.WriteLine(string.Format("{0}: {1}", 
      ch.Source, ch.Text)); 

     c.OnMessage += e.MessageHandler; 
     c.Connect(); 

     Thread.Sleep(Timeout.Infinite); 
    } 
} 

回答

1

这里是类似于你在你的问题,写在objc指定的方法: Supposably我们有一类客户端和FeedEvents。客户端类实现为处理 网络连接(例如,使用AFNetworking)。 FeedEvents与Client类互连以处理来自网络的事件,但这些事件必须调用“client”代码块来简化操作。

@interface Client : NSObject 

- (void)connect; 

@end 

typedef void (^EventBlock) (id someData); 

@interface FeedEvents : NSObject 

@property (nonatomic, strong) EventBlock eventBlock; 

@end 

@interface ProgramClass : NSObject 

- (void)fetchEvents; 

@end 

@implementation ProgramClass 

- (void)fetchEvents { 
    // I prefer using singleton for generic instances that are used through entire application 
    // in the same way, but also sometimes it's better to use this approach: 
    // ... 

    Client *connectionClient = [Client new]; // or custom -[+[ alloc] initWithParameters...]; 
    FeedEvents *eventListener = [FeedEvents new]; // or custom -[+[ alloc] initWithParameters...]; 
    eventListener.eventBlock = ^(id someData) { 
     // do some additional configuration 
    }; 

    // using background queue to connect to some host 
    // but this is only for purpose of the method translation, because 
    // AFNetworking provides very reach background API 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, kNilOptions), ^{ 

     [connectionClient connect]; 
    }; 
} 

@end 

你也可以继承的NSOperation使用此 - (空)主{}方法,在你的榜样,并在后台线程完全运行。

在这个示例代码中,您应该知道块参数等存在一些内存管理问题。对于您来说,在这种情况下更简单的方法是将子操作NSOperation并在后台运行,如here

希望这有帮助

+0

想想我明白了,谢谢! :) – ihatetoregister 2013-05-03 09:20:32

+0

很高兴我能帮到你 – 2013-05-03 09:25:14