gpt4 book ai didi

ios - 使用 block 会自动创建新线程吗?

转载 作者:行者123 更新时间:2023-12-01 17:32:28 31 4
gpt4 key购买 nike

刚开始使用块进行工作……非常困惑。我正在使用这样的块:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *myDictionary = [[mySingleton arrayPeopleAroundMe] objectAtIndex:indexPath.row];

NSMutableString *myString = [[NSMutableString alloc] initWithString:@"http://www.domain.com/4DACTION/PP_profileDetail/"];
[myString appendString:[myDictionary objectForKey:@"userID"]];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[myString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection
sendAsynchronousRequest:urlRequest
queue:queue
completionHandler: ^( NSURLResponse *response,
NSData *data,
NSError *error)
{
[[mySingleton dictionaryUserDetail] removeAllObjects];
[[mySingleton arrayUserDetail] removeAllObjects];

if ([data length] > 0 && error == nil) // no error and received data back
{
NSError* error;
NSDictionary *myDic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
[mySingleton setDictionaryUserDetail:[myDic mutableCopy]];

NSArray *myArray = [myDic objectForKey:@"searchResults"];
[mySingleton setArrayUserDetail:[myArray mutableCopy]];

[self userDetailComplete];
} else if
([data length] == 0 && error == nil) // no error and did not receive data back
{
[self serverError];
} else if
(error != nil) // error
{
[self serverError];
}
}];
}

连接完成后,将称为:
-(void)userDetailComplete {
ViewProfile *vpVC = [[ViewProfile alloc] init];
[vpVC setPassedInstructions:@"ViewDetail"];
[[self navigationController] pushViewController:vpVC animated:YES];
}

导致此错误弹出:
“试图从主线程或Web线程以外的线程获取Web锁。这可能是从辅助线程调用UIKit的结果。”
我摆脱错误的唯一方法是将userDetailComplete更改为此:
-(void)userDetailComplete {
dispatch_async(dispatch_get_main_queue(), ^{
ViewProfile *vpVC = [[ViewProfile alloc] init];
[vpVC setPassedInstructions:@"ViewDetail"];
[[self navigationController] pushViewController:vpVC animated:YES];
});
}

我的问题:每次使用块时都会自动启动一个新线程吗?使用积木时,我还应该注意其他陷阱吗?

最佳答案

块不创建线程。它们是闭包;它们只包含可在将来某个时间运行的可运行代码。

这是在后台线程上运行的,因为这是您要求它执行的操作:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection
sendAsynchronousRequest:urlRequest
queue:queue
...

您创建了一个新队列,然后要求 NSURLConnection在该队列上回叫您。如果要在主线程上被调用,请传递 [NSOperationQueue mainQueue]。通常这就是您想要的。

关于ios - 使用 block 会自动创建新线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844264/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com