2012-12-18 1 views
0

델리게이트와 콜백과 관련된 몇 가지 개념을 이해하려고합니다. 기본적으로 우편 번호를 기반으로 http 요청을하려고합니다. 그래서 http-request를 만들기 전에 location-manager를 호출하고 zipcode를 가져온다. 그러나 그런 기간 동안 나는 그 작업을 완료하기 위해 async를 기다려야하고 피드백을 얻는다. 여기서 우려하는 점은 위치 관리자로부터 설정 한 위임자는 http 요청 클래스와 링크가 없다는 것입니다. 그래서, 어떻게 정보를 delegate에서 http-request로 다시 전달할 수 있는지 이해하려고합니다. 블록을 조사하고 있었지만 대리자의 응답을 기다릴 수있는 블록이 다시 존재합니까? 비동기 작업에서 BOOL 속성으로 설정할 수도 있습니다. 완료되면 요청을 트리거 할 수 있습니다. GCD을 제외하고는 블록을 많이 사용하지 않았으므로 여전히이 문제를 해결하기 위해 노력하고 있습니다.델리게이트에서 이벤트 설정

나는 여기에 어떤 제안을 환영합니다.

답변

2

다음은 스케치입니다 - 오류 조건 및 위치 데이터 캐싱 문제는 무시하십시오. 이것은 모두 viewController에 들어갈 수 있습니다. 우편 번호를 얻기위한 블록이 하나 있지만 원하는 경우 대리인을 통해 나머지를 수행 할 수 있습니다.

//initialise locationManager once (eg in viewDidLoad) 
- (void) initialiseLocationManager 
{ 
    CLLocationManager* locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDelegate:self]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyKilometer]; 
    [locationManager setDistanceFilter:500]; 
    self.locationManager = locationManager; 
} 

//[self startLocating] whenever you want to initiate another http-request 
- (void) startLocating 
{ 
    [self.locationManager startUpdatingLocation]; 
} 

//locationManager delegate method 
//this will get triggered after [self startLocating] 
//when a location result is returned 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation* location = [locations lastObject]; 
    CLGeocoder* geocoder = [[CLGeocoder alloc] init]; 
    [geocoder reverseGeocodeLocation:location 
        completionHandler:^(NSArray *placemarks, NSError *error){ 
         CLPlacemark* placemark = [placemarks objectAtIndex:0]; 
         NSString* zip = [placemark postalCode]; 

     /* 
     implement your http-request code here using the zip string 
     there are various ways to do this 
        but two ways your result will arrive... 

     1 - as a delegate callback 
     so you would implement the relevant delegate method 
        (in this same viewController) to use the result 

     2 - as a completion block 
     so your result-using method would be that block 
     */ 

    }]; 
    [self.locationManager stopUpdatingLocation]; 
} 
+0

이것은 훌륭합니다. 요청을 호출하는 대신에 이미 HttpClass를 가지고 있기 때문에 요청자를 호출하여 해당 객체의 선택자와 내용을 httprequest 클래스의 대리인을 통해 다시 호출합니다. 그러면 httprequest가 호출됩니다. 저 특별한 sel 유형.EX : - (void) executeRequestTypes : (SEL) selector : (HttpRequest *) httpRequest가 selector의 arguements를 보유하는 속성을 갖는 httpRequest. 나는 그것의 좋은 접근 방식이나 다른 디자인 패턴을 사용할 수 있는지에 대해서만 우려하고 있습니다. 감사. – kforkarim

0

매우 유용한 구현 라이브러리 인 AFNetworking이 있습니다.

블록을 사용하여 클래스 간 데이터 통신이 매우 간단합니다 (대리인과 멀리 떨어져 있음).

2

위임에서 프로토콜, 위치 관리자의 프로토콜 및 http rquest 컨트롤러에 의해 정의 된 프로토콜을 모두 준수하는 컨트롤러 (보기 컨트롤러가 될 수 있음)가 있어야합니다.

보기 컨트롤러는 두 개체를 만들고 둘 모두에 대한 대리인으로 할당합니다.
위치 관리자에게 우편 번호를 가져 오도록 지시합니다. 관리자가 완료되면 대표단 [self.delegate didFindZipCode:code onLocationManager: self]에 적절한 대리자 메서드를 보냅니다. 대리자 뷰 컨트롤러 바와 같이,이 방법을

-(void)didFindZipCode:(NSString *)code onLocationManager:(MyLocationManager *)manager 
{ 
    [self.httpRequestController sendZipCode:code]; 
} 

을 구현하고 요구 제어기는 즉시 원하는 데이터를 사용할 수있는 것과 유사한 방식으로보기 컨트롤러에 통보한다.


실제로 블록은 비슷한 방법으로이 처리 될 것이다 - 어떤 위임이 설정되어 있지 않은 호출해야합니다,하지만 코드가 주변에 전달되는 것을, 어떤 일이 즉시 호출 할 것이다 단지.

+0

안녕하세요 @viki, 이것은 정말 좋은 개요입니다. 그러나 블록의 속성을 만들고 변수를 할당하는 옵션을 살펴 보았습니다. 그게 가능한지 확실하지 않은가요? 이 일을 내가 뭐하는거야 .. typedef 무효 (^ CompletionBlock) (SEL 셀, ASIHttpRequest * 요청), 내가 속성을 설정하고 속성 변수와 관련하여 위치 관리자에서 메서드를 호출하는 경우 잘 모르겠습니다 작업? 저는 블록 속성에 대해 지금 혼란 스럽습니다. 어떻게 작동합니까? 당신의 생각은 내가 어떻게 생성되었는지 방법이지만, 문제는 선택자에 대한 참조가 없다는 것입니다. – kforkarim

+0

당신의 질문은 모호하지 않습니다. 그래서 지금 당신이 가지고있는 코드를 게시하지 마십시오. BTW : [ASIHTTPRequest가 중단되었습니다] (http://allseeing-i.com/%5Brequest_release%5D). 그리고 호출해야하는 selector를 추적해야하는 이유는 무엇입니까? 프로토콜은 그것을 정의하고 위임자는 위임자에게 그것을 호출합니다. – vikingosegundo

관련 문제