2012-12-18 43 views
0

我想了解一些关于委托和回调的概念。基本上我试图做一个基于邮政编码的http请求。因此,在提出http请求之前,我会打电话给一个位置管理员并获取一个邮政编码,但是在此期间,我必须等待异步完成该任务并获得反馈。这里的关注点是,我从位置管理器中设置的委托,与http-request类没有任何关联。所以,我想了解如何将信息从委托传递给http请求。我正在调查区块,但是无论如何,您仍然可以等待代表的回复。或者它也可以在异步任务中设置为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)选择器:(HttpRequest *)httpRequest,其中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 void(^ CompletionBlock)(SEL sel,ASIHttpRequest * request),我不知道如果我设置属性,然后调用位置管理器中的方法关于属性变量工作?我现在对于块属性有点困惑,就像它的工作方式一样。你的想法是我如何构建的方式,但问题是我没有任何参考选择器我想调用wth arg – kforkarim

+0

你的问题不仅仅是模糊的,所以你为什么不发布你现在的代码。顺便说一句:[ASIHTTPRequest已停止](http://allseeing-i.com/%5Brequest_release%5D)。为什么你需要跟踪一个需要被调用的选择器?该协议定义并且委托者在委托上调用它。 – vikingosegundo