Objective C 块和 For 循环
Objective C Blocks and For Loop
我正在尝试使用如下示例代码从服务器检索一些数据。然而,它给了我不可预测的结果。我不确定这是因为该块在循环内部或在内存中被覆盖时被释放。
基本上数据与我期望的指标不符。
-(void)retrieveSomeStuff {
for (int i = 0 ; i < items.count; i++)
{
[self retrieveDataForIndex:i
completionHandler:^(NSDictionary *data, NSError *error) {
}];
}
}
-(void) retrieveDataForIndex:i completionHandler:(void(^)(NSDictionary *,NSError*) completionHandler {
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
completionHandler(data,connectionError);
}
}
处理这种情况的最佳方法是什么?
为了避免重新分配,您必须在方法 "retrieveDataForIndex" 中复制块。请参阅下面的修改。
typedef void(^CompletionHandler)(NSData * data, NSError * error);
-(void) retrieveDataForIndex:(NSInteger)i completionHandler:(CompletionHandler)Completion
{
CompletionHandler _completionHandler = [Completion copy];
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.co.in"]];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
_completionHandler(data, connectionError);
[_completionHandler release];
}];
}
-(void)retrieveSomeStuff
{
for (int i = 0 ; i < 10; i++)
{
[self retrieveDataForIndex:i completionHandler:^(NSData *data, NSError *error)
{
NSLog(@"\nData Received");
}];
}
}
我正在尝试使用如下示例代码从服务器检索一些数据。然而,它给了我不可预测的结果。我不确定这是因为该块在循环内部或在内存中被覆盖时被释放。 基本上数据与我期望的指标不符。
-(void)retrieveSomeStuff {
for (int i = 0 ; i < items.count; i++)
{
[self retrieveDataForIndex:i
completionHandler:^(NSDictionary *data, NSError *error) {
}];
}
}
-(void) retrieveDataForIndex:i completionHandler:(void(^)(NSDictionary *,NSError*) completionHandler {
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
completionHandler(data,connectionError);
}
}
处理这种情况的最佳方法是什么?
为了避免重新分配,您必须在方法 "retrieveDataForIndex" 中复制块。请参阅下面的修改。
typedef void(^CompletionHandler)(NSData * data, NSError * error);
-(void) retrieveDataForIndex:(NSInteger)i completionHandler:(CompletionHandler)Completion
{
CompletionHandler _completionHandler = [Completion copy];
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.co.in"]];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
_completionHandler(data, connectionError);
[_completionHandler release];
}];
}
-(void)retrieveSomeStuff
{
for (int i = 0 ; i < 10; i++)
{
[self retrieveDataForIndex:i completionHandler:^(NSData *data, NSError *error)
{
NSLog(@"\nData Received");
}];
}
}