** 개인적 메모입니다. 태클 사절 **
비동기 네트워크 쓰래드
// // NetworkThread.h // // Created by yungduk jung on 12. 5. 14.. // Copyright (c) 2012년 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> #define REQ_METHOD_POST @"POST" #define REQ_METHOD_GET @"GET" #define RES_NET_RESULT @"RES_NET_RESULT" #define RES_NET_ERROR @"RES_NET_ERROR" #define RES_OBJECT_DICTIONARY_KEY @"RES_OBJECT_DICTIONARY_KEY" #define RES_TRANSFER_DICTIONARY_KEY @"RES_TRANSFER_DICTIONARY_KEY" #define DEFAULT_TIMEOUT_INTERVAL 20 @interface NetworkThread : NSObject { @private NSMutableDictionary* objectDictionary; void* blockHandler; } @property(nonatomic, retain) id target; @property(nonatomic, retain) NSString *url; @property(nonatomic, assign) SEL selector; @property(nonatomic, retain) NSData *requestData; @property(nonatomic, retain) NSObject *transferObject; @property(nonatomic, assign) NSTimeInterval timeInterval; @property(nonatomic, retain) NSString *reqMethod; @property(nonatomic, assign) BOOL waitUntil; @property(nonatomic, assign) BOOL isLoing; -(void)setBlockHandler:(void*)block; -(void)start; @end
// // NetworkThread.m // // Created by yungduk jung on 12. 5. 14.. // Copyright (c) 2012년 __MyCompanyName__. All rights reserved. // #import "NetworkThread.h" #import "NetUtil.h" #define HTTP_OK 200 @implementation NetworkThread @synthesize target; @synthesize url; @synthesize selector; @synthesize requestData; @synthesize transferObject; @synthesize timeInterval; @synthesize reqMethod; @synthesize waitUntil; @synthesize isLoing; -(id)init { self = [super init]; objectDictionary = [[NSMutableDictionary alloc] init]; reqMethod = REQ_METHOD_GET; timeInterval = DEFAULT_TIMEOUT_INTERVAL; isLoing = NO; NSLog(@"blockHandler = %@", blockHandler); return self; } -(void)setWaitUtil:(BOOL)wait { waitUntil = wait; } -(void)setTimeOutInterval:(NSTimeInterval)seconds { timeInterval = seconds; } -(void)setReqMethod:(NSString*)requestMethod { reqMethod = requestMethod; } -(void)setBlockHandler:(void*)block { NSLog(@"block = %@", block); blockHandler = (void *)[(void (^)(void))block copy]; NSLog(@"blockHandler = %@", blockHandler); } -(void)start { if( isLoing ) { NSLog(@"NETWORKTHREAD START = %@", self); } [NSThread detachNewThreadSelector:@selector(reqeust) toTarget:self withObject:nil]; } -(void)reqeust { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if( [NetUtil alertIsNetworkEnable] ) { NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init]; if( isLoing ) { NSLog(@"REQEUST TARGET = %@, %@", self, target); NSLog(@"REQEUST SELECTOR = %@, %@", self, NSStringFromSelector(selector)); NSLog(@"REQUEST URL = %@, %@", self, url); NSLog(@"REQUEST URL ENCODING = %@, %@", self, [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]); NSLog(@"REQUEST METHOD = %@, %@", self, reqMethod); NSLog(@"REQUEST TIME INTERVAL = %@, %f", self, timeInterval); } if( [reqMethod isEqualToString:REQ_METHOD_POST] ) { // POST if( requestData != nil ) { [request setHTTPBody:requestData]; [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; } if( isLoing ) { NSLog(@"REQUEST POST DATA = %@, %@", self, [[NSString alloc] initWithData:requestData encoding:NSUTF8StringEncoding]); } } [request setURL:[NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; [request setHTTPMethod:reqMethod]; [request setTimeoutInterval:timeInterval]; NSError* error= nil; NSURLResponse* response = nil; NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if( isLoing ) { //NSLog(@"REQUEST RESPONSE DATA = %@, %@", self, data); NSLog(@"REQUEST RESPONSE ERROR = %@, %@", self, error); NSLog(@"REQUEST RESPONSE STATUS = %@, %d", self, [(NSHTTPURLResponse *)response statusCode]); } if( [(NSHTTPURLResponse *)response statusCode] == HTTP_OK ) { NSString* dataString = nil; if( data != nil ) { [objectDictionary setObject:@"Y" forKey:RES_NET_RESULT]; dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; [objectDictionary setObject:dataString forKey:RES_OBJECT_DICTIONARY_KEY]; [dataString release]; } if( transferObject != nil ) { [objectDictionary setObject:transferObject forKey:RES_TRANSFER_DICTIONARY_KEY]; } } else { [objectDictionary setObject:@"N" forKey:RES_NET_RESULT]; //2012.06.08 리뷰 신청 후 버그 발견.. HTTP_OK 가 아닌데 error 값이 없는 경우가 있다. if( error != nil ) { [objectDictionary setObject:error forKey:RES_NET_ERROR]; } } if( isLoing ) { NSLog(@"REQUEST RESPONSE CALL = %@, %@", self, NSStringFromSelector(selector)); //NSLog(@"REQUEST RESPONSE OBJECT = %@, %@", self, objectDictionary); } if( target != nil ) { [target performSelectorOnMainThread:selector withObject:objectDictionary waitUntilDone:waitUntil]; } /** 블럭 핸들러 처리 */ if( blockHandler != nil ){ ((void (^)(id arg1))blockHandler)(objectDictionary); } [request release]; [self release]; } [pool release]; } -(void)dealloc { if( isLoing ) { NSLog(@"NETWORK THREAD DEALLOC"); } [target release]; [url release]; [requestData release]; [transferObject release]; [reqMethod release]; [objectDictionary release]; [(void (^)(void))blockHandler release]; [super dealloc]; } @end
NetworkThread *networkThread = [[NetworkThread alloc] init]; [networkThread setUrl:@"http://0.0.0.0/smart/ios/index.asp"]; [networkThread setIsLoing:YES]; [networkThread setTarget:self]; [networkThread setSelector:@selector(netResIndexAsp:)]; [networkThread setBlockHandler:^(NSMutableDictionary* obj){ NSLog(@"BLOCK CODE CALL.."); NSLog(@"obj = %@", obj); NSLog(@"RES_NET_RESULT = %@", [obj objectForKey:RES_NET_RESULT]); NSLog(@"self = %@", self); dispatch_sync(dispatch_get_main_queue(), ^{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"AlertView" message:@"alertview in block code" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:@"아니오", nil]; [alertView show]; [alertView release]; }); }]; [networkThread start];
-(void)netResIndexAsp:(NSMutableDictionary*)obj { NSLog(@"obj = %@", obj); NSLog(@"RES_NET_RESULT = %@", [obj objectForKey:RES_NET_RESULT]); }
'Program > iOS' 카테고리의 다른 글
[iOS] Xcode - Could not launch : No such file or directory Error (2) | 2013.01.02 |
---|---|
iOS 무료음악감상 Audio BackgroundTask (6) | 2012.06.12 |
iOS5 ARC를 써야하나...1 (2) | 2012.06.12 |
[iOS] XCode4 Distrubution 만들기. (0) | 2012.02.08 |
Xcode4 - Project Rename (5) | 2012.01.10 |