在我的dispach_async代码中,block我无法访问global variables.我收到了这个错误Variable is not Assignable (missing _block type specifier).
NSString *textString;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
textString = [self getTextString];
});
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我找出原因吗?
multithreading objective-c grand-central-dispatch ios objective-c-blocks
感谢Stanford的CS193p课程(在iTunes U上)以及Big Nerd Ranch的iOS编程书,我学习了iOS编程.在这两个,他们建议使用dispatch_async(),dispatch_get_main_queue()等来处理线程和并发操作.但是,在WWDC 2012关于构建并发UI的会议上,发言人建议使用NSOperationQueue.
dispatch_*()和之间NSOperationQueue有什么区别,有什么理由(技术,性能,风格或其他方面)我应该使用另一个吗?是否NSOperationQueue只是一个Objective-C的包装器dispatch_async,或者是有更多的什么原因呢?
我在我的应用程序中使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的 - 也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装器.我一直在考虑这两个命令是等价的:
dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });
[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)
我不对吗?也就是说,performSelector*命令与GCD命令有区别吗?我已经阅读了很多关于它们的文档,但还没有看到明确的答案.
iphone multithreading objective-c grand-central-dispatch ios
我有一个方法应该支持从任何队列调用,并应该期望.它在后台线程本身运行一些代码,然后在它返回一个值的块参数时使用dispatch_get_main_queue.我不希望它强制它进入主队列,如果不是它进入方法时.有没有办法获得指向当前调度队列的指针?
我的应用程序中有一个场景,我想在一个方法中做一些耗费时间的任务,其中包括一些数据处理和UI更新.我的方法看起来像这样,
- (void)doCalculationsAndUpdateUIs {
// DATA PROCESSING 1
// UI UPDATE 1
// DATA PROCESSING 2
// UI UPDATE 2
// DATA PROCESSING 3
// UI UPDATE 3
}
Run Code Online (Sandbox Code Playgroud)
由于耗时我想在后台线程上进行数据处理,使用,
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
Run Code Online (Sandbox Code Playgroud)
但由于数据处理和UI更新都采用相同的方法,我只想在主线程中使用UI更新,
dispatch_async(dispatch_get_main_queue(), ^{
Run Code Online (Sandbox Code Playgroud)
最后我的方法看起来像这样,
- (void)doCalculationsAndUpdateUIs {
// DATA PROCESSING 1
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 1
});
/* I expect the control to come here after UI UPDATE 1 */
// DATA PROCESSING 2
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 2
});
/* I expect the control …Run Code Online (Sandbox Code Playgroud) multithreading objective-c grand-central-dispatch ios dispatch-async
我正在编写一个中等复杂的iOS程序,需要为一些较长的操作(解析,连接到网络等)提供多个线程.不过,我很困惑,不同的是什么之间dispatch_get_global_queue和dispatch_queue_create.
我应该使用哪一个,你能给我一个简单的解释,一般来说有什么区别吗?谢谢.
开始学习核心数据和dispatch_async.有一段代码可以从数据集中获取图像的url,并将其设置为核心数据的模型,如下所示
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
dispatch_async(dispatch_get_main_queue(), ^{
[photoModel setValue:imageData forKey:@"photoImageData"];
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么我们使用dispatch_get_global_queue外部dispatch_async和dispatch_get_main_queue内部dispatch_async.
在将Objective-C代码移植到Swift时,我遇到过几次这个问题.说我有以下代码:
dispatch_async(dispatch_get_main_queue()) {
self.hostViewController?.view.addSubview(self.commandField)
}
Run Code Online (Sandbox Code Playgroud)
这将导致错误,强调整个dispatch_async通话,提供:
Could not find member 'addSubview'
Run Code Online (Sandbox Code Playgroud)
我认为这是一个尚未正确实现的错误,因为如果我将addSubview调用放在dispatch_async块外,项目构建正常.最初我认为它可能与self块中的捕获有关.但是,插入[unowned self] in结果会产生相同的错误[weak self] in(在!插入适当的展开操作符之后).
如何dispatch_async在Swift中获取需要捕获的块self?
我在使用内置的Xcode单元测试框架SenTestingKit测试一些宏的中央调度代码时遇到了一些麻烦.我成功地解决了我的问题.我有一个单元测试,它构建一个块并尝试在主线程上执行它.但是,该块永远不会被实际执行,因此测试会挂起,因为它是同步调度.
- (void)testSample {
dispatch_sync(dispatch_get_main_queue(), ^(void) {
NSLog(@"on main thread!");
});
STFail(@"FAIL!");
}
Run Code Online (Sandbox Code Playgroud)
什么是导致它挂起的测试环境?
我在dispatch_semaphore_dispose上获得了EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0),但实际上并不知道如何找到它的根本原因.我的代码使用dispatch_async,dispatch_group_enter等.
更新:崩溃的原因是由于webserviceCall(请参阅下面的代码)从不调用onCompletion,并且当代码再次运行时,我收到错误EXC_BAD_INSTRUCTION.我确认情况确实如此,但不确定为什么或如何防止这种情况.

码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();
for (...) {
if (...) {
dispatch_group_enter(group);
dispatch_async(queue, ^{
[self webserviceCall:url onCompletion:^{
dispatch_group_leave(group);
}];
});
}
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
dispatch_sync(queue, ^{
// call completion handler passed in by caller
});
});
Run Code Online (Sandbox Code Playgroud)