-(CLPlace*)getStartplace
     {
         __block CLPlace* start;
         [ self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *places, NSError *error) {
             CLPlace *startPlaceMark=[places firstObject];
             start=startPlaceMark;
                      }];
         NSLog(@"%@",start);//这里打印出的是一个 null,是因为 block 是异步的,所以会先走下面的 return,
         return start;
}
求大神解答

解决方案 »

  1.   

    -(void )getStartplace resultBlock:(void(^)(CLPlace *obj))block
         {
             __block CLPlace* start;
             [ self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *places, NSError *error) {
                 CLPlace *startPlaceMark=[places firstObject];
                 start=startPlaceMark;
                  if(block) block(start);
                          }];
             NSLog(@"%@",start);//这里打印出的是一个 null,是因为 block 是异步的,所以会先走下面的 return,
             
    }
      

  2.   

    大神能不能给详细解释下这个block的用法,菜鸟还是不懂(⊙o⊙)…
      

  3.   

        - (CLPlace*)getStartplace
        {
        //先创建一个semaphore
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
            __block CLPlace* start;
            [self.geoCoder geocodeAddressString:_SourceText.text completionHandler:^(NSArray *places, NSError *error) {      
              CLPlace *startPlaceMark = [places firstObject];
                start = startPlaceMark;
               //发出已完成的信号
                dispatch_semaphore_signal(semaphore);
            }];
            //等待执行,不会占用资源
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            return start;
        }其实我想要的是这样的效果,二楼回复的方法也可用,但是饶了一圈又回去了,我想要直接返回start的值
      

  4.   

    你创建queue的作用是什么?我也在网上看到了很多这个方法,但是我用的时候报错了。也不理解创建了一个queue但是一直没使用,为什么都还写上去了。