我试图绕过异步性;调度,多线程,运行循环等.
有什么区别:
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查询的情况下,每种方法的优缺点是什么?一种方法比另一种方法有什么好处吗?
最佳答案 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通常会同时进行数百个提取,并且应用程序有多个类同时运行OperationsRunner.
如果您在NSOperation中处理JSON,您将在具有多个核心的设备上获得真正的加速.