iOS4的实现 – ?

我怎么能实现-[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] iOS的-[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] <5?

 #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 #import <objc/runtime.h> #import "NSURLConnection+iOS4.h" // Dynamically add -[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]. void *sendAsynchronousRequest4(id self, SEL _cmd, NSURLRequest *request, NSOperationQueue *queue, void (^handler)(NSURLResponse*, NSData*, NSError*)); void *sendAsynchronousRequest4(id self, SEL _cmd, NSURLRequest *request, NSOperationQueue *queue, void (^handler)(NSURLResponse*, NSData*, NSError*)) { // How should we implement this? } @implementation NSURLConnection (SendAsync) + (void)load { SEL sendAsyncSelector = @selector(sendAsynchronousRequest:queue:completionHandler:); if (![NSURLConnection instancesRespondToSelector:]) { class_addMethod([self class], sendAsyncSelector, (IMP)sendAsynchronousRequest4, "v@:@@@"); } } @end #endif 

 // NSURLConnection+SendAsync.h #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 #import <Foundation/Foundation.h> @interface NSURLConnection (SendAsync) @end #endif // NSURLConnection+SendAsync.m #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 typedef void (^URLConnectionCompletionHandler)(NSURLResponse *response, NSData *data, NSError *error); @interface URLConnectionDelegate : NSObject <NSURLConnectionDataDelegate> @property (nonatomic, strong) NSURLResponse *response; @property (nonatomic, strong) NSMutableData *data; @property (nonatomic, strong) NSOperationQueue *queue; @property (nonatomic, copy) URLConnectionCompletionHandler handler; @end @implementation URLConnectionDelegate @synthesize response; @synthesize data; @synthesize queue; @synthesize handler; - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)theResponse { self.response = theResponse; [data setLength:0]; // reset data } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData { [data appendData:theData]; // append incoming data } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; self.data = nil; if (handler) { [queue addOperationWithBlock:^{ handler(response, nil, error); }]; } } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // TODO: Are we passing the arguments to the block correctly? Should we copy them? if (handler) { [queue addOperationWithBlock:^{ handler(response, data, nil); }]; } } @end #import <objc/runtime.h> #import "NSURLConnection+SendAsync.h" // Dynamically add @property (nonatomic,readonly) UIViewController *presentingViewController. void sendAsynchronousRequest4(id self, SEL _cmd, NSURLRequest *request, NSOperationQueue *queue, URLConnectionCompletionHandler handler); void sendAsynchronousRequest4(id self, SEL _cmd, NSURLRequest *request, NSOperationQueue *queue, URLConnectionCompletionHandler handler) { URLConnectionDelegate *connectionDelegate = [[URLConnectionDelegate alloc] init]; connectionDelegate.data = [NSMutableData data]; connectionDelegate.queue = queue; connectionDelegate.handler = handler; NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:connectionDelegate]; NSAssert(connection, nil); } @implementation NSURLConnection (SendAsync) + (void)load { SEL sendAsyncSelector = @selector(sendAsynchronousRequest:queue:completionHandler:); if (![NSURLConnection instancesRespondToSelector:sendAsyncSelector]) { class_addMethod(object_getClass([self class]), sendAsyncSelector, (IMP)sendAsynchronousRequest4, "v@:@@@"); } } @end #endif 

我通常做一个NSOperation的子类,并在操作的主要方法内执行同步请求。 为了调用这个操作,我创build了一个子类的实例并把它放到一个队列中(而不是主线程)。 然后,当操作完成时,可以使用接收到的数据调用委托或通过NSNotificationCenter发布通知。

我会用ASIHTTPRequest(不再被开发,但仍然非常好)或RestKit(我以前从未使用过,但听说它是体面的)已经构build的框架。 这些将在不同版本的操作系统中为您提供相同的function(asynchronousHTTP请求)。

ifdefs并不是要走的路,因为它们是在编译时完成的,不会为每个平台编译单独的应用程序版本。

你可能可以在运行时做一些诡计,让它起作用,但看起来更麻烦,而不是值得。