如何从后台线程返回数据?
我有一个方法,应该返回一个数组,这是一个后台线程填充。 我想等到return语句,直到数组完全填充。 我该怎么做? 我知道如何处理没有返回types的数据,但我想调用这个函数,并获得填充数组。
示例(这里数组结束为空,因为它在数组填充之前返回 – 我想做一些事情来返回填充的数组):
-(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; }
使用委托,或阻止并取出return arrayToReturn;
。 在“for”和“dispatch_async”之后:
dispatch_async(dispatch_get_main_queue(),^{ [myDelegate passComputedArray:arrayToReturn]; });
- (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,一旦完成,做你的function
如果你想等到它返回,那就没有必要把它背景化了。
-(NSArray*)fetchSomeArray{ NSArray *someArray = ...; // getting some array from database return someArray; }
但是我敢打赌,你真的想用返回的值做一些事情,这需要一些时间来计算,而不会阻塞主线程,所以你可以将数组传递回同一个对象或其他地方的方法。
-(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 }
处理这个问题的最简单方法是在数组完成后调用一个函数,并在那里处理数组。
-(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
。