在性能方面,重构常见的HTTP请求代码是否值得?

时间:2012-11-17 07:50:19

标签: objective-c ios performance

我一直在开发一款由经验丰富的开发者提供的iPhone应用程序。我只是一名学徒程序员,仍然在努力实现Objective-C / iOS应用程序开发(我自己学习了Java和PHP,但Objective-c对我来说并不像这些)。

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

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

E.g。

-(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书籍(并用谷歌搜索过),但很难找到真正应用程序开发的这种“实用”答案,大多数时候它对像我这样的初学者来说相当混乱。

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

发送一条额外消息的性能不值得一提。一般来说,人们担心表现太多。如果你可以牺牲性能以获得更好的可读性,那么99次中有100次是值得的。