【发布时间】:2014-10-29 10:56:29
【问题描述】:
我正在构建一个 iPhone 应用程序,该应用程序大量利用了我用 php 编写的 Web 服务。现在我有一个文件(API.h/API.m),其中包含通过 NSURLConnection 在我的 Web 服务上调用 php 函数的方法。
方法如:
-(void) mediaAdd:(UIImage *)image withDelegate: (id<apiRequest>) delegate;
-(void) mediaGet:(NSString *)imageURL withDelegate: (id<apiRequest>) delegate;
这些方法由应用程序中的控制器(由 MVC 模式定义的控制器)调用,这些方法将控制器作为委托。
一旦来自 API.h/API.m 中被调用方法的请求完成,在请求完成时调用 API.h/API.m 中的 NSURLConnection 委托方法,然后调用委托方法...
-(void) serverResponse:(NSDictionary *) response fromCall:(NSString *)call;
...这当然是在调用 API.h/API.m 中方法的控制器上执行的。
当控制器需要进行多个 API 调用时,就会出现我的问题,或者说混乱。因为我只有一个委托方法,所以我通过serverResponse方法中的call参数来区分不同的调用。
下面是 serverResponse 方法实例的框架:
//API Delegate
-(void)serverResponse:(NSDictionary *)response fromCall:(NSString *)call {
bool local = false;
NSString *callbackString;
if (local) {
callbackString = @"http://localhost/";
} else {
callbackString = @"http://secret.com/";
}
if ([call isEqualToString:[NSString stringWithFormat:@"%@user/add",callbackString]]) {
//user/add was called
if (![[response objectForKey:@"status"] isEqualToString:@"fail"]) {
if ([[response objectForKey:@"status"] isEqualToString:@"fail"]) {
if ([[response objectForKey:@"reason"] isEqualToString:@"udid already taken"]) {
//UDID taken
}
} else {
//UDID not taken, we're good to go
}
} else {
NSLog(@"fail");
}
} else if([call isEqualToString:[NSString stringWithFormat:@"%@moment/get",callbackString]]){
//moment/get was the api call
} else if([call isEqualToString:[NSString stringWithFormat:@"%@printPictures/printPic",callbackString]]){
//printPictures/printPic was the api call
} else {
NSLog(@"wrong call");
}
}
我的问题是,我应该继续为每个 API 调用创建一个委托方法吗?还是我想太多了,实际上有一个非常简单的方法来处理这个问题。也许是设计模式或结构?
谢谢! - 迈克
【问题讨论】:
-
题外话观察,不过现在看骨架,我有很多冗余代码..哈哈。只是注意到我注意到了这一点,所以我知道这是个问题。
-
您可以传递完成块而不是委托。
-
您当然意识到可以为给定的委托协议创建多个委托对象?要解决您的问题,只需为每个 API 调用创建一个对象。
-
Hot Licks,我在我的问题中提到了该解决方案,但我不想通过它,除非它是最后一个可用的选项。
-
请注意,“单独的委托对象”与“单独的委托方法”不同。您可以拥有同一个委托类的多个副本,实现相同的委托方法。
标签: ios objective-c api nsurl delegation