我在我的应用程序中使用了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
如何确保我的函数仅在主线程上运行?(它更新UI元素)
这样的函数被认为是"坏"吗?
-(void)updateSomethingOnMainThread {
if ( ![[NSThread currentThread] isEqual:[NSThread mainThread]] )
[self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:NO];
else {
// Do stuff on main thread
}
}
Run Code Online (Sandbox Code Playgroud)
我这样写它是为了避免有第二个功能,最初我有这样的:
-(void)updateSomethingOnMainThread_real {
// Do stuff on main thread
}
-(void)updateSomethingOnMainThread {
[self performSelectorOnMainThread:@selector(updateSomethingOnMainThread_real) withObject:nil waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud) 我需要在后台线程上绘制文本以将其保存为图像.
我正在做
UIGraphicsPushContext()
[NSString drawInRect:]
UIGraphicsPopContext()
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但有时它在drawInRect中崩溃,当我也在同时绘制主线程时.
我尝试使用NSAttributedString,如下所示: UIStringDrawing方法似乎在iOS 6中不是线程安全的.但是[NSAttributedString drawInRect:]由于某种原因似乎没有在我的后台线程上呈现任何内容.主线程似乎工作正常.
我一直在考虑使用Core Text,但看起来Core Text也有类似的问题:CoreText在多个线程中运行时崩溃
是否有线程安全的方式来绘制文本?
更新: 如果我运行此代码,它几乎立即崩溃在drawInRect与EXC_BAD_ACCESS:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0);
UIFont* font = [UIFont systemFontOfSize:14.0f];
for (int i = 0; i < 100000000; i++) {
[@"hello" drawInRect:CGRectMake(0, 0, 100, 100) withFont:font];
}
UIGraphicsEndImageContext();
});
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0);
UIFont* font = [UIFont systemFontOfSize:12.0f];
for (int i = 0; i < 100000000; i++) {
[@"hello" drawInRect:CGRectMake(0, 0, 100, 100) withFont:font];
}
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
如果我删除UIFont并只绘制没有字体的文本,它可以正常工作.
更新: 这似乎只在iOS …
是否-drawRect:必须在主线程上绘制UIView的方法,或者CADisplayLink 是否可以-setNeedsDisplay在不同的运行循环中调用自定义视图?
我setNeedsDisplay在一个新线程中调用该方法,但我没有看到我的视图中的任何更改.在调用setNeedsDisplay新主题后,我该怎么做才能看到我的所有更改?