在Objective-C中编写SDK

Ker*_*rog 0 objective-c ios

基本上,我想使用我正在编写的SDK进行api调用.

我有以下课程:

  • 汽车
  • CarData(存储创建汽车所需的输入值,如模型,制造等)

基本上要创建一辆汽车,我会做以下事情:

[Car carWithData: cardata onSuccess: successHandler onError: errorHandler] 
Run Code Online (Sandbox Code Playgroud)

这基本上是一个工厂方法,它在发出API调用请求并使用响应填充新的Car类并将该实例传递给successHandler之后创建Car的实例.

所以"Car"有上面的静态方法来创建那辆车,还有非静态的方法来编辑,删除汽车(这会编辑,删除对服务器的API调用)

因此,当Car创建静态方法时,通过执行以下操作将新车传递给successHandler:

successHandler([[Car alloc] initWithDictionary: dictionary)
Run Code Online (Sandbox Code Playgroud)

成功处理程序可以继续使用该新车执行以下操作:

[car update: cardata]
[car delete]
Run Code Online (Sandbox Code Playgroud)

考虑到新车对象现在每辆车都有一个ID,它可以传递给更新和删除API调用.

我的问题:

  • 我是否需要cardata对象来存储用户输入,还是可以将它们存储在car对象中,以后存储所有api调用的响应?
  • 我该如何改进这个模型?

关于CarData,请注意不同的API调用可能有不同的输入.所以create function可能需要知道model,make等,但是find函数可能需要知道要查找的项数,限制,起始id等.

Rob*_*ier 5

首先,名称在构建SDK时非常重要.你的名字有点令人困惑.CarData听起来非常像是与...有关NSData."包含另一个类信息的类"的典型名称是"描述符".所以,我会称之为CarDescriptor.看到UIFontUIFontDescriptor寻找灵感.

接下来,你carWithData:onSuccess:onError:的声音应该会回归Car,但它似乎是void.我推荐以下内容:

+ (void)createCarWithDescriptor:(CarDescriptor *)descriptor 
                     completion:(void (^)(Car *car, NSError *error))completion;
Run Code Online (Sandbox Code Playgroud)

优选具有单个完成块,而不是两个.不要为完成处理程序添加前缀on.

CarDescriptor类应该帮助你与你的搜索问题为好,但它不应该包括诸如限制.你应该把它包装成一个CarSearchRequest(或者可能只是一个CarSearch).见NSFetchRequest灵感.是传递CarDescriptor还是需要完整谓词取决于您的服务如何管理搜索.(当然,您总是可以使用将代码转换CarDescriptor为谓词的代码.)再次,看看如何UIFontDescriptor使用搜索字体来获取灵感.

  • 很好的答案.着名的AFNetwork库使用该模式(successBlock,failureBlock).我不能强调这种界面有多糟糕.谢谢你的指点;-) (2认同)