我试图更好地了解队列及其工作原理。这个片段是为了测试他们的行为:
- (void)dispatchQueueTest
{
NSLog( @"Begin test on %@ thread", [NSThread isMainThread] ? @"main" : @"other" );
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async( dispatch_get_main_queue(), ^{
NSLog( @"Signalling semaphore" );
dispatch_semaphore_signal(s);
});
NSLog( @"Waiting for worker" );
while( dispatch_semaphore_wait( s, DISPATCH_TIME_NOW ) ) {
NSDate* timeout = [NSDate dateWithTimeIntervalSinceNow:10.f];
// Process events on the run loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeout];
}
dispatch_release(s);
NSLog( @"All sync'd up" );
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会在日志中生成以下内容:
Begin test on main thread
Waiting for worker
Signalling semaphore
All sync'd up …Run Code Online (Sandbox Code Playgroud) 与世界上的应用程序一样,我的 React 应用程序需要对 API 执行一些 Ajax 调用。
我选择使用 Redux 中间件,以便正确地将 API 获取与我的组件分开。
这个想法是从我的组件中分派REQUEST操作。中间件监听它们并调度SUCCESS或ERROR操作:最后这些由减速器监听。
这里很多人已经问过如何从 Redux 中间件分派操作:这不是我的问题的主题:)
首先,让我向您展示我用来编写的一个简单的减速器:
function currentUserReduxer(state = {}, action = {}) {
const { currentUser, error } = action.payload;
switch (action.type) {
case 'GET_CURRENT_USER_REQUEST':
return { ...state, isFetching: true, error: null };
case 'GET_CURRENT_USER_SUCCESS':
return { ...state, id: currentUser.id, isFetching: false };
case 'GET_CURRENT_USER_FAILURE':
return { ...state, isFetching: false, error };
default:
return state;
}
}
Run Code Online (Sandbox Code Playgroud)
以及相应的中间件:
() => …Run Code Online (Sandbox Code Playgroud) 我很清楚 dispatch_async 队列正在执行什么,但我不清楚 dispatch_sync 的目的是什么。例如:这有什么区别:
NSLog(@"A");
NSLog(@"B");
Run Code Online (Sandbox Code Playgroud)
和这个:
dispatch_sync(dispatch_get_main_queue(), ^ {
NSLog(@"A");
});
NSLog(@"B");
Run Code Online (Sandbox Code Playgroud)
据我所知,两种方式的输出都是 A 然后是 B。因为同步是按照写入的顺序执行的。谢谢。
我在从 API 获取一些数据时遇到上述错误。action creator以下是我尝试GET数据的代码:
import { FETCH_USER } from './types';
import axios from 'axios';
export const fetchUser = () => async dispatch => {
console.log('fetchUser');
const res= await axios.get('/api/current_user');
dispatch({ type: FETCH_USER, payload: res });
};
Run Code Online (Sandbox Code Playgroud)
另外,当我在代码编辑器中调试时,控制台给出以下错误:
SyntaxError: Unexpected token import
我在viewItem中有一个默认图像,以确保它正常工作,该图像显示在splitview的详细信息视图上。
@IBOutlet weak var ImageView: UIImageView!
var imageCache = [String: UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
self.configureView()
}
func configureView() {
if let detail: AnyObject = self.detailItem {
if let label = self.detailDescriptionLabel {
let dict = detail as [String: String]
label.text = ""
let s = dict["result"]
let vr = NString(string: s!)
let vrd = vr.doubleValue
let value = ceil(vrd*20)
let valueString = String(format: "%.0f", value)
vresult.text = "\(valueString)%"
getPic(dict) // <---- trouble maker
fitem.hidden = false
ritem.hidden = …Run Code Online (Sandbox Code Playgroud) 我正在设置一个计时器,以便在第二次通过后我重置键盘扩展的值.问题是我觉得以下调用阻止了我的UI:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self resetDoubleTapBool];
})
Run Code Online (Sandbox Code Playgroud)
有一种异步方式可以做到这一点,或者更好的方式吗?谢谢!
multithreading objective-c grand-central-dispatch ios dispatch-async
Xcode 7 beta 5.我试图dispatch_async_f用来避免阻塞.
func myFirstFunc() {
let identifier = QOS_CLASS_BACKGROUND
let queue = dispatch_get_global_queue(identifier, 0)
let context: UnsafeMutablePointer<Void> = nil
let work: dispatch_function_t = myOtherFunc
dispatch_async_f(queue, context, work)
}
func myOtherFunc(context: UnsafeMutablePointer<Void>) {
}
Run Code Online (Sandbox Code Playgroud)
出了错误:
AC函数指针只能通过对'func'或文字闭包的引用形成
我很难搞清楚如何修复"此应用程序正在从后台线程修改自动布局引擎"错误.任何帮助是极大的赞赏.
我尝试使用这个类似问题概述的方法来使用dispatch_async(dispatch_get_main_qeueu()),但它没有解决问题.我使用不正确吗?
从调试开始,我已经发现Firebase调用重置用户密码至少是问题的一部分.当我遗漏该代码时,没有错误.
相关代码和完整错误消息如下:
//MARK: - Forgot Password Button Tapped
@IBAction func forgotPasswordButtonTapped(sender: AnyObject) {
let userEnteredEmail = emailTextField.text
//Have Firebase send email to reset password
dispatch_async(dispatch_get_main_queue(), {
FIRAuth.auth()?.sendPasswordResetWithEmail(userEnteredEmail!, completion: { error in
if error != nil {
//Tell user that the user name or password is incorrect.
let errorCode = error!.code
switch (errorCode) {
// Error code handling alerting user to issue.
}
}
else {
//Send user to the forgot password screen.
self.performSegueWithIdentifier("toForgotPasswordViewController", sender: self)
} …Run Code Online (Sandbox Code Playgroud) 我知道所有 UI 更新都必须从主线程完成。
但纯粹是为了更深入地了解 GCD 和 dispatch main 是如何工作的:
我有一个运行网络调用的按钮,我最终在它的 completionHandler 中执行以下操作:
self.layer.borderColor = UIColor(red: 255/255.0, green: 59/255.0, blue: 48/255.0, alpha: 1.0).cgColor
self.layer.borderWidth = 3.0
Run Code Online (Sandbox Code Playgroud)
发生颜色变化需要 6-7 秒。显然,如果从主线程运行上面的代码,它会立即改变边框颜色。
问题 1即使我没有任何其他代码可以运行,为什么 UI 更改不会立即从后台线程发生?还在等什么?
有趣的是,如果我点击按钮进行网络调用,然后点击textField 本身(在 6-7 秒之前),边框颜色会立即改变。
发生这种情况是因为:
从后台线程我已经更新了模型,即更改将要更新的 UI/视图排队的 textField 颜色……但是由于我们在后台队列中,因此更新 UI 可能需要几秒钟的时间
但随后我立即点击了 textField 并强制超级快速读取 textField 及其所有属性,包括边框 - 从主线程(实际用户触摸始终通过主线程处理)......即使还没有屏幕上显示为红色,但由于模型上显示为红色,因此它将从中读取并立即将颜色更改为红色。
问题 2:这种观察是否正确?
如果我不点击并等待:
如果我点击:
我的完整代码如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBAction func isValid(_ sender: Any) {
let userEmail = textField.text …Run Code Online (Sandbox Code Playgroud) 我开始学习Redux并且整个想法看起来很整洁,但是在将我的React应用程序从"正常"重建为"redux-way"之后,出现了这个问题.
我有一个列表,列出了我基于异步调用的JSON构建的项目.然后该列表上的每个项目都会在点击时发送异步调用并返回一些内容.
在我的应用程序非常简单之前:
components/list/List.jsx
components/list/ListItem.jsx
Run Code Online (Sandbox Code Playgroud)
现在它看起来像这样:
footer/list/ListContainer.jsx // here I run an async call and generate list
footer/list/List.jsx // dumb component creating the whole list full of ListItemContainer components as <li>
footer/list/ListItemContainer.jsx // here I run another async for each <li>
footer/list/ListItem.jsx // dumb component containing <li>
Run Code Online (Sandbox Code Playgroud)
IMO要复杂得多,但还有另外一个问题.
每次我点击我的<li>组件我想触发一个动作然后做一些事情,我的问题是:我可以在ListItem.jsx中做到吗?我不这么认为,因为它是一个愚蠢的组成部分?
这是我的ListItem.jsx:
import React from 'react';
import { connect } from 'react-redux';
// some other imports
class ListItem extends React.Component {
render(props) {
return (
<li>
<a href="#" onClick={//can I …Run Code Online (Sandbox Code Playgroud) dispatch-async ×10
ios ×4
swift ×4
objective-c ×3
reactjs ×2
redux ×2
asynchronous ×1
axios ×1
firebase ×1
javascript ×1
nsrunloop ×1
onclick ×1
react-redux ×1
synchronous ×1
uiimageview ×1