2017-05-19 85 views
0

因此,讓我們假設我有以下代碼對於異步循環,然後等待它完成(的OBJ-C)

-(void)doSomething{ 
    [self expensiveMethod]; 
    [self otherMethod]; //Depends on above method to have finished 
} 

-(void)expensiveMethod{ 
for(int i = 0; i<[someArray count]; i++{ 
    [self costlyOperation:someArray[i]]; 
    } 
} 

理想我想[self costlyOperation]分拆其他線程使每一個爲已完成接近並行(當然,我意識到這不是完全可能的)。一旦對每個數組對象完成了[self costlyOperation],我希望它返回,以便[self otherMethod可以利用處理。

回答

1

您可以使用默認隊列在後臺使用調度異步運行任務。

編輯

您可以並行執行ASYC組異步任務。您可能需要按照您的要求稍微調整一下。

-(void)doSomething{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     //Background Thread 
     [self expensiveMethod:^{ 
      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //Run UI Updates 
       [self otherMethod]; //Depends on above method to have finished 
      }); 
     }]; 
    }); 
} 

-(void)expensiveMethod:(void (^)(void))callbackBlock { 

    dispatch_group_t group = dispatch_group_create(); 

    for(int i = 0; i<[someArray count]; i++) { 
     __block int index = i; 
     dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
      [self costlyOperation:someArray[index]]; 
     }); 
    } 

    dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     if (callbackBlock) { 
      callbackBlock(); 
     } 
    }); 
} 
+0

那麼這樣的答案的一部分。另一部分在'expensiveMethod'裏面,我想要並行運行for循環處理。 – user1416564

+0

我編輯了答案。 – Bilal

+0

謝謝!問題:我可以擁有的線程數是否有限制? – user1416564