1

我一直在开发一个 iPhone 应用程序,由一位经验丰富的开发人员提供。我只是一个学徒程序员,还在为实际的 Objective-C/iOS 应用程序开发而苦苦挣扎(我自己学习了 Java 和 PHP,但 Objective-c 对我来说完全不是这些)。

我们的应用程序只是另一个“以网络为中心”(我什至不知道这个词是否合适......)应用程序,它严重依赖服务器端操作,每次都会发出频繁的 http post 请求(例如跟踪用户位置,向其他用户发送消息等)。

当我被分配开发这个应用程序时,我在代码中看到,每个 http 请求都写在每个方法中。每个请求都是通过调度另一个线程来完成的,并且每个动作都是为这些请求的响应而相应地编写的。

例如

-(void) methodA {  
// Making http request headers...  

// Dispatch another thread  
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);  
dispatch_async(queue, ^{  
  // Send synchronous request and handle the response...  
});

}  

-(void) methodB {  
// Making http request headers...  

// Dispatch another thread  
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);  
dispatch_async(queue, ^{  
  // Send synchronous request and handle the response...  
});

}  

当应用程序需要向服务器发送请求时,上面的代码无处不在。

我想知道,为什么他没有创建一个处理 http 请求的类。
在 Java 中,您可以创建一个向服务器发出同步请求的类:

public class ClassHttpRequest {
     public int makePost {  
        // Send synchronous request and return result...  
     }  
}  

然后创建这个类的一个实例并在线程内执行它的实例方法(在本例中为 makePost):

public class methodA {  

   Thread t = new Thread(new Runnable() {  
         public void run() {   
           public ClassHttpRequest requestHandler = new ClassHttpRequest();  
               if (success == requestHandler.makePost()) {  
                   // Handle response...  
               }  
           }  
         }  
     });

    t.start();  
 }  

在 Objective-C 中创建一个类并让它处理频繁的 http 请求是否有任何性能损失或问题?或者,它只是根本不“推荐”之类的?我听说,在 Objective-C 中,使用 try-catch 语句进行异常处理并不常见,因为它会消耗大量资源。我确实读过几本 iOS 和 Objective-C 的书籍(并在 google 上搜索过),但是对于真正的应用程序开发来说,这种“实用”的答案很难找到,大多数时候它会让像我这样的初学者感到困惑。

我应该问他为什么不创建这样的课程,但他现在不在,我无法联系到他。另外,我相信 stackoverflow 的专业人士可以为我提供比我的前任更准确和简洁的解决方案。(我已经问了几个问题,并且已经得到了我想知道的内容。)

提前致谢。

4

2 回答 2

3

面向对象设计的常规规则适用:如果将 HTTP 请求表示为有形对象是有意义的——特别是,有一堆样板代码是必要的,否则会被复制粘贴——那么使用它可能是个好主意一类。否则,没有必要。尽管在这种特定情况下,您是否有理由不只是使用标准的异步系统 API - NSURLRequest、NSURLConnection、NSURLDownload 等?

@try/@catch 根据定义用于异常处理,应根据需要使用。如果您忽略它们,您的代码可能会以不必要的有趣方式(例如使锁悬空)或不必要的程度(例如完全崩溃而不是简单地使特定操作失败)失败。您不应该将它们用于流控制——与其他语言不同,Objective-C 异常适用于程序员错误、“不可能”条件和其他此类事件。不幸的是,很多现有的 Objective-C 代码都不是异常安全的,所以当你应该使用它们时,你不应该依赖它们。

它们在您现在可能使用的任何运行时中都不是特别昂贵 - @try 非常便宜,几乎是免费的。只有在抛出异常时才会完成任何重要的工作,并且由于您应该只在非常糟糕的情况下看到它们 - 即不经常 - 性能成本是无关紧要的。

于 2012-11-17T08:22:50.097 回答
1

重构代码是一个平衡问题。当前的代码很冗长并且有点重复,但是将其重构为一个单独的类将引入一个新的间接方法,即一个中间 API。如果新的 API 具有良好的语义,这可能是值得的,例如,如果您可以使用诸如 之类的方法创建一个SomeNetworkService类。接口应该是异步的,如下所示:postStatuslistItems

typedef void (^StatusCompletionBlock)(BOOL success, NSError *error);
- (void) postStatus: (NSString*) status withCompletion: (StatusCompletionBlock) completion;

SomeNetworkService这应该使代码更易读,更干,甚至更可测试,因为您可以用存根替换整个对象。所以这肯定是值得的。

发送一条额外消息对性能的影响不值一提。一般来说,人们过于担心性能。如果您可以牺牲性能以获得更好的可读性,那么 100 次中有 99 次是值得的。

于 2012-11-17T08:43:48.040 回答