1

我想在 Objective-C 中为美洲杯数据流 API 实现一个库,并且正在四处寻找是否已经存在,并在 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);
    }
}
4

1 回答 1

1

这是您在问题中指定的类似方法,用 objc 编写:假设我们有一个类 Client 和 FeedEvents。客户端类被实现来处理网络连接(例如使用AFNetworking)。FeedEvents 与 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 子类化以使用此 - (void)main {} 方法,如您的示例中一样,并在后台线程中完全运行它。

在这个示例代码中,您应该知道块参数等存在一些内存管理问题。在这种情况下,对您来说更简单的方法是继承 NSOperation 并像这里一样在后台运行它。

希望这会有所帮助

于 2013-05-02T09:44:05.670 回答