2013-02-25 22 views
0

我有一個方法應該返回一個在後臺線程中填充的數組。我想等返回語句,直到數組完全填充。我會怎麼做?我知道如何處理沒有返回類型的數據,但我想調用此函數並獲取已填充的數組。如何從後臺線程返回數據?

例(在這裏,陣列結束了空,因爲它返回填充陣列之前 - 我想做些什麼來回報人口陣列):

-(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; 

} 

回答

6

使用代表團,或塊,取出return arrayToReturn; 。在您的「爲」與「dispatch_async」裏面:

dispatch_async(dispatch_get_main_queue(),^{ 
     [myDelegate passComputedArray:arrayToReturn]; 
}); 
+0

我希望這是可能的另一種方式,好像它是不是。代表團是我要走的路,謝謝。 – 2013-02-25 17:18:46

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]; 

}); 

}

但是,如果你想要一個回傳功能進行任何更新n您將需要運行在主線程功能,而不是背景的UI。要做到這一點,你可以使用performSelector: onThread: withObject: waitUntilDone:或者你可以使用另一個dispatch_async使用主線程而不是全局線程。

1

如果您想等到它返回,則不需要對其進行背景處理。

-(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 
} 
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和做一次,做你的功能