2012-07-06 59 views
1
for (NSString * district in allLinedStrings) { 
    PO1(district); 
    [self.mainLock lock]; 
    CLGeocoder * geocode= [[CLGeocoder alloc]init]; 
    [geocode geocodeAddressString:district completionHandler:^(NSArray *placemarks, NSError *error) 
    { 
     for (CLPlacemark * thePlace in placemarks) 
     { 
      [self handlePlacemark:thePlace]; 

     } 
     [self.mainLock unlock]; 
    }]; 
} 

我想同步运行geocodeAddressString,我这样做。不知何故,我有错误的僵局。但是,怎么了?这个锁定方案有什么问题

+0

*我想同步运行geocodeAddressString,我这样做* - 的API是异步的一个原因。你应该遵循这个原则,并重新启动你的程序。例如等待'allLinedStrings'数组,处理下一个完成时调用... – justin 2012-07-06 09:35:52

回答

1

如果您使用的是NSLock:在同一个线程上调用两次锁定方法会永久锁定您的线程。

for (NSString * district in allLinedStrings) { 
    PO1(district); 
    [self.mainLock lock]; 
    CLGeocoder * geocode= [[CLGeocoder alloc]init]; 
    [geocode geocodeAddressString:district completionHandler:^(NSArray *placemarks, NSError *error) 
    { 
     for (CLPlacemark * thePlace in placemarks) 
     { 
      [self handlePlacemark:thePlace]; 

     } 

    }]; 
[self.mainLock unlock]; 
} 
+0

好吧,我们不知道'self.mainLock'是否是递归锁... – justin 2012-07-06 09:30:33

+0

小心解决这个问题?我认为它应该等到解锁。 – 2012-07-12 05:46:43