2011-09-12 5 views
0

하나의 객체에 REST 연결 모델을 저장하려고하므로 반복해서 사용하지 않아도됩니다.iPhone 응용 프로그램에서 반복적 인 코드를 단순화하기 위해 사용자 정의 NSObject 클래스를 사용하는 데 문제가 있습니다.

//RestModel.h 
#import "ASIHTTPRequest.h" 

@interface RestModel : NSObject{ 
    NSString* _baseUrl; 
    NSString* _modelUrl; 
} 

@property (nonatomic, retain) NSString* modelUrl; 

- (id)initWithModel:(NSString*)model; 
- (NSDictionary*)getById:(NSInteger*)ident; 
- (NSDictionary*)getAll; 

@end 

//RestModel.m 
#import "RestModel.h" 

@implementation RestModel 

@synthesize modelUrl = _modelUrl; 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     _baseUrl = @"http://myRESTurl.com"; 
    } 

    return self; 
} 

- (id)initWithModel:(NSString*)model 
{ 
    self = [super init]; 
    if (self) { 
     _baseUrl = @"http://myRESTurl.com"; 
     self.modelUrl = [NSString stringWithFormat:@"%@/%@/", _baseUrl, model]; 
    } 

    return self; 
} 

- (NSDictionary*)HTTPRequest:(NSURL*)url 
{ 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request startSynchronous]; 
    NSError *error = [request error]; 
    if(!error){ 
     NSData *responseData = [request responseData]; 
     NSString *errorDesc = nil; 
     NSPropertyListFormat format; 

     [error release]; 
     [request release]; 

     return (NSDictionary*)[NSPropertyListSerialization propertyListFromData:responseData mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
    }else{ 
     NSLog(@"%@", error); 
     return nil; 
    } 
} 

- (NSDictionary*)getById:(NSInteger*)ident 
{ 
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", self.modelUrl, ident]]; 
    return [self HTTPRequest:url]; 
} 

- (NSDictionary*)getAll 
{ 
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", self.modelUrl]]; 
    return [self HTTPRequest:url]; 
} 

- (void)dealloc 
{ 
    [_modelUrl release]; 
// [_responseData release]; 
// [_responseDict release]; 
    [super dealloc]; 
} 

@end 

편집 : 지금은 충돌하는 것이 아니라, 내 로컬있는 NSDictionary 0 나는 내 컨트롤러에 -viewDidLoad에 다음 전화 드렸습니다의 수 있습니다 여기에 내가 만든 모델이다

RestModel* rm = [[RestModel alloc] initWithModel:@"user"]; 
self.dict = [rm getAll]; 
[rm release]; 

[self.dict count]의 NSLog를 컨트롤러 전체에 설치했습니다. 그것은 항상 0입니다. RestModel rm이 호출되고 함수가 호출됩니다 (다시 NSLog). 데이터는 없습니다. 어떤 아이디어?

답변

2
[error release]; 
    [request release]; 

사람들을 자동 해제 객체해야합니다, 당신은 편리한 방법으로 그것들을 가지고 같은, 그래서 그들에게 명시 적으로 응용 프로그램 충돌을 만들 것입니다 발표.

+0

좋아, 지금은 충돌하지 않지만 NSDictionary는 비어 있습니다. -viewDidLoad에서로드하고 심지어 내 NSDictionary -tableView : tableView numberOfRowsInSection : 섹션의 개수에 대한 NSLog를 넣고 0이 나온다. RestModel을 해제하지 않아야합니까? 이것은 -viewDidLoad에서로드하는 방법입니다. RestModel * rm = [[RestModel alloc] initWithModel : @ "user"]; self.dict = [rm getAll]; [rm release]; – rnystrom

+0

릴리스 중입니다. HTTPRequest 메서드에 로그인 해보십시오 ... – Macmade

+0

신경 쓰지 마세요. 카운트 문제는 내 자신의 잘못 이었어. 너 락. – rnystrom

1

NSInteger는 객체가 아니므로 NSInteger *를 사용하여 전달할 필요가 없으며 확실하게 % @ 형식 지정자를 사용하고 싶지 않습니다. 대신이 시도 :

- (NSDictionary*)getById:(NSInteger)ident 
    { 
     NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d", self.modelUrl, ident]]; 
     return [self HTTPRequest:url]; 
    } 
+0

사용자 제공 예제에서 getById가 사용되지 않아도 마찬가지입니다. – Macmade

+0

고마워요. 예, 내 전반적인 문제를 해결하지는 못하지만, 나는 여전히 새롭기 때문에 이러한 것들이 도움이됩니다! – rnystrom

관련 문제