所以,这是一个带块的简单方法
-(void)getPointsInRange:(double)radius nearByPoint:(SGPoint *)nearByPoint
{
SGStorageQuery *query = [SGStorageQuery queryWithPoint:nearByPoint layer:SimpleGeoMainLayerName];
[query setRadius:radius];
[mainClient retain];
[mainClient getRecordsForQuery:query
callback:[SGCallback callbackWithSuccessBlock:
^(id response) {
// you've got records!
// to create an array of SGStoredRecord objects...
NSArray *records = [NSArray arrayWithSGCollection:response type:SGCollectionTypeRecords];
NSLog(@"records received:%i",[records count]);
[self arrayOfPointsReceived:records];
} failureBlock:^(NSError *error) {
// handle failure
NSLog(@"getPointsInRange error:%@",[error description]);
}]];
}
该方法连接到某个SDK并返回带有结果的NSArray。
我想找到一种方法,getPointsInRange方法将返回NSArray。
所以它的签名是-(NSArray*)getPointsInRange...
我可以通过委托来完成,但我想在一个函数中完成所有操作。
答案 0 :(得分:2)
在我看来,你想要保留你的蛋糕并吃掉它。或者有一个调用异步代码的方法,同时返回结果。您可以将方法转换为同步方法,如果这是您想要的:
- (void) computeSomethingAndReturnSynchronously
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self doSomeAsynchronousOperationWithCompletion:^{
// take the call results here
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore);
}
这将运行异步代码,然后阻止执行,直到异步调用的结果可用。这有帮助吗? (我应该补充一点,我宁愿保持代码异步并在另一个完成块中返回NSArray
。)