SDWebImage中dispatch_queue_async_safe宏的作用

本文解析了SDWebImage中用于确保主线程执行的宏dispatch_main_async_safe的实现原理。通过条件判断和dispatch_async函数的应用,该宏能够智能地决定代码块是在当前队列还是指定队列上异步执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在阅读SDWebImage时,发现以下宏定义。

#ifndef dispatch_queue_async_safe
#define dispatch_queue_async_safe(queue, block)\
// 判断是否在主队列执行
    if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(queue)) == 0) {\
    // 主队列
        block();\
    } else {\
    // 其他线程
        dispatch_async(queue, block);\
    }
#endif

#ifndef dispatch_main_async_safe

#define dispatch_main_async_safe(block) 
dispatch_queue_async_safe(dispatch_get_main_queue(), block)

#endif

使用方法:

dispatch_main_asyn_safe(^{
	// 需要在主线程执行的代码
})
  • strcmp(s1, s2)比较字符串大小,s1 == s2,返回0;s1 > s2, 返回正数;s1 < s2, 返回负数。
  • dispatch_queue_get_label获取队列表示。
%load_ext autoreload %autoreload 2 %matplotlib inline A module that was compiled using NumPy 1.x cannot be run in NumPy 2.0.2 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0. Some module may need to rebuild instead e.g. with 'pybind11>=2.12'. If you are a user of the module, the easiest solution will be to downgrade to 'numpy<2' or try to upgrade the affected module. We expect that some modules will need time to support NumPy 2. Traceback (most recent call last): File "E:\anaconda\lib\runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "E:\anaconda\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "E:\anaconda\lib\site-packages\ipykernel_launcher.py", line 17, in <module> app.launch_new_instance() File "E:\anaconda\lib\site-packages\traitlets\config\application.py", line 846, in launch_instance app.start() File "E:\anaconda\lib\site-packages\ipykernel\kernelapp.py", line 712, in start self.io_loop.start() File "E:\anaconda\lib\site-packages\tornado\platform\asyncio.py", line 199, in start self.asyncio_loop.run_forever() File "E:\anaconda\lib\asyncio\base_events.py", line 601, in run_forever self._run_once() File "E:\anaconda\lib\asyncio\base_events.py", line 1905, in _run_once handle._run() File "E:\anaconda\lib\asyncio\events.py", line 80, in _run self._context.run(self._callback, *self._args) File "E:\anaconda\lib\site-packages\ipykernel\kernelbase.py", line 510, in dispatch_queue await self.process_one() File "E:\anaconda\lib\site-packages\ipykernel\kernelbase.py", line 499, in process_one await dispatch(*args) File "E:\anaconda\lib\site-packages\ipykernel\kernelbase.py", line 406, in dispatch_shell await result File "E:\anaconda\lib\site-packages\ipykernel\kernelbase.py", line 730, in execute_request reply_content = await reply_content File "E:\anaconda\lib\site-packages\ipykernel\ipkernel.py", line 390, in do_execute res = shell.run_cell(code, store_history=store_history, silent=silent) File "E:\anaconda\lib\site-packages\ipykernel\zmqshell.py", line 528, in run_cell return super().run_cell(*args, **kwargs) File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2914, in run_cell result = self._run_cell( File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2960, in _run_cell return runner(coro) File "E:\anaconda\lib\site-packages\IPython\core\async_helpers.py", line 78, in _pseudo_sync_runner coro.send(None) File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3185, in run_cell_async has_raised = await self.run_ast_nodes(code_ast.body, cell_name, File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3377, in run_ast_nodes if (await self.run_code(code, result, async_=asy)): File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3457, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "C:\Users\John\AppData\Local\Temp\ipykernel_7032\4138125057.py", line 3, in <module> get_ipython().run_line_magic('matplotlib', 'inline') File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2364, in run_line_magic result = fn(*args, **kwargs) File "E:\anaconda\lib\site-packages\decorator.py", line 232, in fun return caller(func, *(extras + args), **kw) File "E:\anaconda\lib\site-packages\IPython\core\magic.py", line 187, in <lambda> call = lambda f, *a, **k: f(*a, **k) File "E:\anaconda\lib\site-packages\IPython\core\magics\pylab.py", line 99, in matplotlib gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui) File "E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3533, in enable_matplotlib from matplotlib_inline.backend_inline import configure_inline_support File "E:\anaconda\lib\site-packages\matplotlib_inline\__init__.py", line 1, in <module> from . import backend_inline, config # noqa File "E:\anaconda\lib\site-packages\matplotlib_inline\backend_inline.py", line 6, in <module> import matplotlib File "E:\anaconda\lib\site-packages\matplotlib\__init__.py", line 109, in <module> from . import _api, _version, cbook, docstring, rcsetup File "E:\anaconda\lib\site-packages\matplotlib\rcsetup.py", line 27, in <module> from matplotlib.colors import Colormap, is_color_like File "E:\anaconda\lib\site-packages\matplotlib\colors.py", line 56, in <module> from matplotlib import _api, cbook, scale File "E:\anaconda\lib\site-packages\matplotlib\scale.py", line 23, in <module> from matplotlib.ticker import ( File "E:\anaconda\lib\site-packages\matplotlib\ticker.py", line 136, in <module> from matplotlib import transforms as mtransforms File "E:\anaconda\lib\site-packages\matplotlib\transforms.py", line 46, in <module> from matplotlib._path import ( --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) AttributeError: _ARRAY_API not found --------------------------------------------------------------------------- ImportError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_7032\4138125057.py in <module> 1 get_ipython().run_line_magic('load_ext', 'autoreload') 2 get_ipython().run_line_magic('autoreload', '2') ----> 3 get_ipython().run_line_magic('matplotlib', 'inline') E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py in run_line_magic(self, magic_name, line, _stack_depth) 2362 kwargs['local_ns'] = self.get_local_scope(stack_depth) 2363 with self.builtin_trap: -> 2364 result = fn(*args, **kwargs) 2365 return result 2366 E:\anaconda\lib\site-packages\decorator.py in fun(*args, **kw) 230 if not kwsyntax: 231 args, kw = fix(args, kw, sig) --> 232 return caller(func, *(extras + args), **kw) 233 fun.__name__ = func.__name__ 234 fun.__doc__ = func.__doc__ E:\anaconda\lib\site-packages\IPython\core\magic.py in <lambda>(f, *a, **k) 185 # but it's overkill for just that one bit of state. 186 def magic_deco(arg): --> 187 call = lambda f, *a, **k: f(*a, **k) 188 189 if callable(arg): E:\anaconda\lib\site-packages\IPython\core\magics\pylab.py in matplotlib(self, line) 97 print("Available matplotlib backends: %s" % backends_list) 98 else: ---> 99 gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui) 100 self._show_matplotlib_backend(args.gui, backend) 101 E:\anaconda\lib\site-packages\IPython\core\interactiveshell.py in enable_matplotlib(self, gui) 3531 """ 3532 from IPython.core import pylabtools as pt -> 3533 from matplotlib_inline.backend_inline import configure_inline_support 3534 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select) 3535 E:\anaconda\lib\site-packages\matplotlib_inline\__init__.py in <module> ----> 1 from . import backend_inline, config # noqa 2 __version__ = "0.1.6" # noqa E:\anaconda\lib\site-packages\matplotlib_inline\backend_inline.py in <module> 4 # Distributed under the terms of the BSD 3-Clause License. 5 ----> 6 import matplotlib 7 from matplotlib import colors 8 from matplotlib.backends import backend_agg E:\anaconda\lib\site-packages\matplotlib\__init__.py in <module> 107 # cbook must import matplotlib only within function 108 # definitions, so it is safe to import from it here. --> 109 from . import _api, _version, cbook, docstring, rcsetup 110 from matplotlib.cbook import MatplotlibDeprecationWarning, sanitize_sequence 111 from matplotlib.cbook import mplDeprecation # deprecated E:\anaconda\lib\site-packages\matplotlib\rcsetup.py in <module> 25 from matplotlib import _api, cbook 26 from matplotlib.cbook import ls_mapper ---> 27 from matplotlib.colors import Colormap, is_color_like 28 from matplotlib.fontconfig_pattern import parse_fontconfig_pattern 29 from matplotlib._enums import JoinStyle, CapStyle E:\anaconda\lib\site-packages\matplotlib\colors.py in <module> 54 import matplotlib as mpl 55 import numpy as np ---> 56 from matplotlib import _api, cbook, scale 57 from ._color_data import BASE_COLORS, TABLEAU_COLORS, CSS4_COLORS, XKCD_COLORS 58 E:\anaconda\lib\site-packages\matplotlib\scale.py in <module> 21 import matplotlib as mpl 22 from matplotlib import _api, docstring ---> 23 from matplotlib.ticker import ( 24 NullFormatter, ScalarFormatter, LogFormatterSciNotation, LogitFormatter, 25 NullLocator, LogLocator, AutoLocator, AutoMinorLocator, E:\anaconda\lib\site-packages\matplotlib\ticker.py in <module> 134 import matplotlib as mpl 135 from matplotlib import _api, cbook --> 136 from matplotlib import transforms as mtransforms 137 138 _log = logging.getLogger(__name__) E:\anaconda\lib\site-packages\matplotlib\transforms.py in <module> 44 45 from matplotlib import _api ---> 46 from matplotlib._path import ( 47 affine_transform, count_bboxes_overlapping_bbox, update_path_extents) 48 from .path import Path ImportError: numpy.core.multiarray failed to import
最新发布
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向善AIGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值