哪些任务更适合使用NSOperation,而不是GCD在为iPhone编程时使用?
对我来说,他们似乎做同样的事情.我看不出一方面的优势和劣势.
NSData一直有一个非常方便的方法叫做+dataWithContentsOfURL:options:error:.虽然方便,但它也会阻止当前线程的执行,这意味着它对生产代码(忽略NSOperation)基本上没用.我很少使用这种方法,我完全忘记了它的存在.直到最近.
我从管中获取数据的方式是标准NSURLConnectionDelegate方法:编写一个处理各种NSURLConnectionDelegate方法的下载类,逐步构建一些数据,处理错误等.我通常会使这个通用的足以重用为尽可能多的要求.
假设我的典型下载程序类在100行的球场中运行.这是100行异步做什么NSData可以在一行同步.为了更复杂,下载程序类需要自己的委托协议来向其所有者传达完成和错误,并且所有者需要以某种方式实现该协议.
现在,进入Grand Central Dispatch,我可以做一些非常简单的事情:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSData* data = [NSData dataWithContentsOfURL:someURL];
// Process data, also async...
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Back to the main thread for UI updates, etc.
});
});
Run Code Online (Sandbox Code Playgroud)
而且我可以把这个傻瓜扔进我想要的任何地方,就像在线一样.无需下载类,无需处理连接委托方法:只需几行即可轻松实现异步数据.这种方法与我之前的GCD方法之间的差异非常大,足以触发太好的真实警报.
因此,我的问题:使用NSData+ GCD进行简单的数据下载任务是否有任何警告而不是NSURLConnection(假设我不关心下载进度之类的事情)?
我在网上找到了一些信息来创建一个使用GCD的单例类.这很酷,因为它的线程安全,开销很低.遗憾的是,我找不到完整的解决方案,只能找到sharedInstance方法的片段.所以我使用试错法制作了自己的课 - 而且瞧瞧 - 以下内容出来了:
@implementation MySingleton
// MARK: -
// MARK: Singleton Pattern using GCD
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedInstance] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)autorelease { return self; }
- (oneway void)release { /* Singletons can't be released */ }
- (void)dealloc { [super dealloc]; /* should never be called */ }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* That's soooo non-zero */ }
+ (MySingleton …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?
从我的理解异步执行事情的顺序,它获取的东西,而同步执行串行..
但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情执行的顺序.
我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了什么.
我正在使用Kiwi测试框架在我的应用程序中测试身份验证方法.在调用dispatch_sync时,测试冻结,如下所示:
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_sync(main, ^
{
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationAuthenticationSuccess object:nil userInfo:ret];
});
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它冻结在那里,如果有人有任何提示.
multithreading cocoa-touch objective-c grand-central-dispatch
我正在尝试为我工作的公司创建一个(网络)同步数组.虽然网络部分工作正常,但我已经陷入了一个问题.
我希望创建一个新队列使用dispatch_create_queue,我将添加两个不在主线程上运行的块,但是以串行方式运行,这意味着首先必须运行第一个块,然后是第二个块,而不是平行.
我已经阅读了苹果文档,但至少可以说是令人困惑的.
当我使用创建队列dispatch_queue_create然后使用时添加块(在它们被定义之后)dispatch_sync,我发现该块仍然在主线程上执行.
使用时dispatch_async,即当主线程上没有执行块时.
当我尝试使用dispatch_sync它们添加两个块时永远被阻止.
两个块似乎运行良好并且离开主线程的唯一时间是在调用时dispatch_async.
然而,我之所以选择GCD和同步方法,是因为我的印象是我正在创建一个新队列(因此是一个新线程),并且向该队列添加块只会阻塞一个,直到另一个完成执行.是不是这种情况,或者创建队列不保证代码不会在主线程上运行?
有没有办法取消未来一段时间内安排的dispatch_after(),到目前为止还没有解雇?我正在尝试为服务器更新调度程序,这个方法就像我想要的那样,但是,我希望在某些时候取消并重新安排它.是否有可能或我必须回退并使用NSTimer?
以下代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 1 %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"LOW %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 2 %d", i);
}
});
Run Code Online (Sandbox Code Playgroud)
导致高1,高2和低原木的混合物.
如何同时打印high1和high2日志.在同一个队列中不是high1和high2博客?那么在开始执行high2块之前不应该将high1块完成?
我有一个UITableView,显示与每行中的联系人关联的图像.在一些情况下,这些图像在地址簿联系人图像的第一显示器上被读取,并且在没有一个的情况下,他们是基于存储的数据呈现的化身.我现在使用GCD在后台线程上更新这些图像.然而,这种加载快速滚动时,这意味着该队列变得冗长而当用户停止滚动当前细胞是他们所要求的顺序,图像最后得到更新.在iPhone 4上,这个问题并不是很明显,但我很想支持旧硬件并在iPhone 3G上进行测试.延迟是可以容忍的,但非常明显.
令我感到震惊的是,Last In-First Out堆栈似乎很可能在很大程度上解决了这个问题,因为每当用户停止滚动这些单元格时,下一个将被更新,然后将更新当前屏幕外的其他单元格.Grand Central Dispatch可以做到这样吗?或者没有太繁重的其他方式实施?
顺便说一下,我注意到我正在使用带有SQLite存储的Core Data而我没有使用NSFetchedResultsController,因为为了加载此视图的数据,必须遍历多对多关系.(据我所知,这排除了使用NSFetchedResultsController.) [我发现NSFetchedResultsController可以与多对多关系一起使用,尽管官方文档似乎在说.但是我还没有在这种情况下使用它.
另外:请注意,虽然主题是"我如何使用GCD创建最后进入第一个堆栈",但实际上我只想解决上面列出的问题并且可能有更好的方法来实现它.我非常愿意接受像timthetoolman那样以另一种方式解决问题的建议; 如果这样的建议最终是我使用的,我会认识到原始问题的最佳答案以及我最终实施的最佳解决方案...... :)
我正在尝试这两种方法:
dispatch_async(dispatch_get_main_queue(),^{
[self handleClickAsync];
});
Run Code Online (Sandbox Code Playgroud)
和
[self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0];
Run Code Online (Sandbox Code Playgroud)
响应按钮按下.
第二个允许UIButton突出显示正如人们期望的那样并handleClickAsync在下一个运行循环中执行(我想:"以后某个时候"肯定).第一个不允许UIButton实例在操作完成之前点亮.
使用GCD执行此操作的正确方法是什么,或者performSelector仍然是唯一的方法?
ios ×7
objective-c ×6
iphone ×3
cocoa-touch ×2
asynchronous ×1
fifo ×1
nsoperation ×1
singleton ×1
uitableview ×1