作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] 如何批次执行一个method?
时间Fri Feb 15 14:18:18 2013
※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
1F:推 Blueshiva:我怎麽直接想到的是丢到GCD中去排队... 02/14 11:47
2F:→ uranusjr:啊对耶 GCD 就有 serial 了... 02/14 12:17
3F:→ kiii210:昨天我也有想到...不过不会用..是dispatch_queue吗? 02/14 12:20
4F:推 johnlinvc:GCD 可能不太行。因为async 的function 会立刻return 02/15 12:45
会立刻 return 不代表会立刻开始下载啊
...
dispatch_queue_t queue;
...
// 其实 DISPATCH_QUEUE_SERIAL 是预设, 不过这样语意比较清楚
queue = dispatch_queue_create("image fetching queue", DISPATCH_QUEUE_SERIAL);
- (void)consumeURLs:(NSArray *)URLs
{
for (NSURL *URL in URLs)
{
dispatch_async(queue, ^{
id dlr = [SDWebImageDownloader sharedDownloader];
[dlr downloadImageWithURL:URL
options:0
progress:^(NSUInteger rsz, long long esz) {
// Whatever
}
completed:^(UIImage *image,
NSData *data,
NSError *error,
BOOL finished) {
// Whatever
}];
});
}
}
...
dispatch_release(queue);
因为 GCD 的 queue 本身就是一个结束才会开始另一个(毕竟都叫 queue 了...)
所以这样就可以让一个下载结束後才会开始下一个
其实我怀疑 SDWebImageDownloader 本身应该就有提供这个功能
因为看起来它应该就是用 GCD 实作的
其实这边用 dispatch_sync 应该效果也差不多
-downloadImageWithURL:options:progress:completed: 这个 method 本身就是 async
不过这个方法的缺点是自订性可能稍微差一点
因为 dispatch_async 和 dispatch_sync 都是一出去就没办法收回来了
如果你想先判断上一个下载的结果, 再决定怎麽继续下一个下载
那麽就要 tweak 一下才行
--
作者 Linux (Windows) 看板 C_and_CPP
标题 [问题] 如何确认是否 free 对记忆体
时间 Fri Nov 2 00:14:03 2012
5F:→ akasan:valgrind, 但 windowns 版的没试过XD 11/02 00:43
6F:→ akasan:linux 上那真的是不二选择了 11/02 00:44
7F:→ Linux:我是用 Windows ....>"< 11/02 00:45
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.81.146
8F:推 kiii210:谢谢, 晚点来试试看,其实我最初尝试是用for来跑, 02/15 14:36
9F:→ kiii210:结果没想到一次就把所有image跑完了, 所有的下载都是同时 02/15 14:37
10F:→ kiii210:进行~没有queue到... 02/15 14:37