Objective c 从块iOS中获取数据(目标C)
因此,这里有一个简单的方法和一个块Objective c 从块iOS中获取数据(目标C),objective-c,cocoa-touch,objective-c-blocks,Objective C,Cocoa Touch,Objective C Blocks,因此,这里有一个简单的方法和一个块 -(void)getPointsInRange:(double)radius nearByPoint:(SGPoint *)nearByPoint { SGStorageQuery *query = [SGStorageQuery queryWithPoint:nearByPoint layer:SimpleGeoMainLayerName]; [query setRadius:radius]; [mainClient ret
-(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。
我想找到一种方法,让GetPointsRange方法返回NSArray。
所以它的签名将是-(NSArray*)getPointsInRange…
我可以简单地通过委派来完成,但我想在一个函数中完成所有工作。在我看来,您也希望保留蛋糕并吃掉它。或者有一个方法调用异步代码,同时同步返回结果。如果需要,可以将该方法转换为同步方法:
- (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
)GCD-savy信号量?方便的那么,在串行调度队列上调用调度信号量等待时会发生什么情况呢?我猜它将取消调度,但仍然被阻塞(因为否则它不会是串行的)。是的,队列将被阻塞,直到信号量发出信号。这意味着您很容易陷入死锁,这就是为什么我更喜欢使用常规完成块异步返回结果的原因。