我正试图绕过异步;调度,多线程,运行循环等等。
有什么区别:
1)在给定方法中创建NSURLRequest和NSURLConnection,并让它执行并响应委托方法(didReceiveResponse,didReceiveData,connectionDidFinishLoading等),以及
2)创建一个块并使其具有dispatch_async?
使用第一种方法,我可以访问委托方法(我是否仍然可以访问使用dispatch的那些方法?),并且在触发(或接近它?)时执行委托方法
使用块/调度方法,我猜测块是在其线程内同步处理的?然后回到主线程处理结果?示例代码我一直在看:
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL:
kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
那么,“self performSelector ....”是在收到数据后执行的吗? (我之前的意思是同步 - 也许是错误的术语)。然后块的下一行将我们发送回主线程。
目的是什么,或者为什么会出现“waitUntilDone:YES”?是因为如果它不存在,其他的东西可能不会发生在主线程中吗?
上面的第一个方法是否仍然只在主线程上执行?
最后,在对网页进行JSON查询的情况下,每种方法的优缺点是什么?一种方法比另一种方法有什么好处吗?
答案 0 :(得分:2)
1)当您使用NSURLConnection时,无论是在主线程中还是在NSOperation中,您都可以完全控制在任何时候停止它并跟踪其进度。你得到的是各种各样的事情发生时的委托方法,但你不是坐着等待完成某事。如果你想在任何时候停止它,你发送它取消,然后你可以释放(或零)并忘记它。
2)所以看看这个。如果你在主线程中执行了这个调用,它会等到它成功或失败。一旦开始,它必须运行成功或失败。如果在主线程中,这将阻止您的UI。把它放在一个块中并在其他一些线程上运行,同样的事情会发生 - 选择的线程将阻塞直到方法结束。使用'self'发送结果将保留自我。因此,如果自己说一个UIViewController,那么即使你弹出它(认为它会被删除),它仍然存在,直到这个方法完成,天堂知道什么。这种用法非常危险并且可能经常工作,但是当设备有一个糟糕的inet连接时(例如)会发生灾难性的失败。
等待直到确实是同步线程。如果您想知道该方法已在主线程上运行,并且只有继续,请使用YES。如果你只想让方法排队并且你已经完成了(就像在这种情况下那样)你只需要使用NO。
该方法肯定会在主线程上 - 这个Apple会向您承诺使用此方法。
3)JSON
我认识的大多数用户都使用来自NSOperations或块的NSURLConnections。可以取消操作(这将取消连接) - 因此无论发生了多少,您都可以按下“后退”按钮。如果查询失败,您可以查看html状态(您是否收到400或500错误?超时?等)
在github上有一个开源项目,几乎没有200行代码,它提供了一个优雅且易于使用的帮助程序类来运行操作(使用演示代码):/NSOperation-WebFetches-MadeEasy。我个人在商店中的8个应用程序中使用了这个代码并取得了巨大的成功 - 单个OperationsRunner通常会同时进行数百个提取,并且应用程序有多个类同时运行OperationsRunners。
如果您在NSOperation中处理JSON,您将在具有多个核心的设备上获得真正的加速。