1

我正在为 REST API 编写一个 Objective-C 包装器。我正在阅读的很多内容都说不要使用同步 NSUrlConnection 请求以避免阻塞主线程。这是有道理的,但我想知道,在 Objective-C 中制作 API 包装器的最佳方法是什么?

例如,我们有一个 API 方法,它接受会话 ID 并返回会话是否有效。理想情况下,包装方法原型如下所示:

- (BOOL) sessionIsValid:(NSString *)sessionId;

因此,可以调用该方法,并且可以使用返回值来决定下一步要做什么。但是如果 API 调用是异步的,这将如何工作?调用者似乎需要将自己设置为包装器的委托,发出请求,然后处理来自委托方法的响应。对于这样一个简单的 API 调用,看起来很丑陋。有没有好的方法来实现这一目标?

4

2 回答 2

1

会话是有效还是过期,应该是底层网络层的实现细节。因此,您很少会在 Objective-C API 中使用此方法。相反,您将拥有一个看起来更像这样的 API:

typedef void (^completion_t)(id result, NSError* error);

- (void) fetchAllPostsWithUser:(ID)userID completion:(completion_t)completionHandler;

这是一种异步方法。调用站点将通过调用完成处理程序来通知完成,该处理程序传递操作的结果和可能的错误对象。实际上是什么result,完全取决于您:它可能是NSArray类的自定义对象,Post也可能是 JSON(序列化或作为对象),或其他。无论如何,它必须在文档中明确定义。

您的“会话问题”是身份验证方案的一部分。在许多情况下,已经可以NSURLSession分别NSURLConnection处理对您完全透明的身份验证。如果没有,有一些委托方法可以被覆盖,您可以在其中定制行为。该 Objective-C API 的客户端(使用此 API 作为库的开发人员)永远不应该关心诸如“会话”之类的“抽象”和“晦涩”概念。他/她只知道密码、用户、帖子等;)

于 2013-10-31T08:19:02.127 回答
0

如果你想返回一个 BOOL,你需要已经设置了会话并缓存了有效性(到期日期)——这并不总是可能的。委托模式是一个不错的选择。不要忘记您可以使用块来实现委托模式(这使您可以选择让多个不同的委托同时使用 API)。

于 2013-10-31T08:01:58.330 回答