我有一个方法应该返回一个填充在后台线程中的数组。我想等待return语句,直到数组完全填充。我该怎么办?我知道如何处理没有返回类型的数据,但我想调用此函数并获取填充的数组。
示例(这里数组结束为空,因为它在填充数组之前返回 - 我想做一些事情来返回填充的数组):
-(NSArray*)fetchSomeArray{
__block NSArray *arrayToReturn;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSArray *someArray = ...; // getting some array from database
arrayToReturn = [NSMutableArray new];
for(int i=0;i<someArray.count;i++){
[arrayToReturn addObject:...];
}
});
return arrayToReturn;
}
答案 0 :(得分:6)
使用委托或阻止并取出return arrayToReturn;
。在你的“for”和“dispatch_async”之后:
dispatch_async(dispatch_get_main_queue(),^{
[myDelegate passComputedArray:arrayToReturn];
});
答案 1 :(得分:4)
- (void)someMethod:(void (^)(BOOL result))completionHandler {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//all your functionality
// Check that there was not a nil handler passed.
if( completionHandler ){
//your function to so that you can return
}
});
});
传递completionHandler并完成后,执行您的功能
答案 2 :(得分:1)
如果你想等到它返回,就没必要给它背景了。
-(NSArray*)fetchSomeArray{
NSArray *someArray = ...; // getting some array from database
return someArray;
}
但是我敢打赌你真的想用这个返回的值做一些事情,这需要一些时间来计算而不会阻塞主线程,所以你可以将数组传回给同一个对象或其他地方的方法。 / p>
-(void)fetchSomeArray{
__block id bself = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSArray *someArray = ...; // getting some array from database
[bself arrayFetched:someArray];
});
return arrayToReturn;
}
-(void)arrayFetched:(NSArray*)array{
// do something with the returned array
}
答案 3 :(得分:0)
最简单的处理方法是在数组完成后调用函数并在那里处理数组。
-(void)fetchSomeArray{
__block NSArray *arrayToReturn;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSArray *someArray = ...; // getting some array from database
arrayToReturn = [NSMutableArray new];
for(int i=0;i<someArray.count;i++){
[arrayToReturn addObject:...];
}
[self finishedArrayResult:arrayToReturn];
});
}
但是如果你想让返回函数更新UI的任何内容,你需要在主线程而不是后台运行该函数。要做到这一点,您可以使用performSelector: onThread: withObject: waitUntilDone:
,也可以使用主线程而不是全局线程使用另一个dispatch_async
。