我正在测试一些使用Grand Central Dispatch进行异步处理的代码.测试代码如下所示:
[object runSomeLongOperationAndDo:^{
STAssert…
}];
Run Code Online (Sandbox Code Playgroud)
测试必须等待操作完成.我目前的解决方案如下:
__block BOOL finished = NO;
[object runSomeLongOperationAndDo:^{
STAssert…
finished = YES;
}];
while (!finished);
Run Code Online (Sandbox Code Playgroud)
看起来有点粗糙,你知道更好的方法吗?我可以通过调用暴露队列然后阻塞dispatch_sync:
[object runSomeLongOperationAndDo:^{
STAssert…
}];
dispatch_sync(object.queue, ^{});
Run Code Online (Sandbox Code Playgroud)
......但是这可能会暴露太多object.
我需要创建一个格式的字符串,可以将int,long,double等类型转换为字符串.使用Obj-C,我可以通过以下方式完成.
NSString *str = [NSString stringWithFormat:@"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE, STRING_VALUE];
Run Code Online (Sandbox Code Playgroud)
如何用swift做同样的事情?
是否可以在减速机本身发送动作?我有一个进度条和一个音频元素.目标是在音频元素中更新时间时更新进度条.但是我不知道将ontimeupdate事件处理程序放在何处,或者如何在ontimeupdate的回调中调度一个动作来更新进度条.这是我的代码:
//reducer
const initialState = {
audioElement: new AudioElement('test.mp3'),
progress: 0.0
}
initialState.audioElement.audio.ontimeupdate = () => {
console.log('progress', initialState.audioElement.currentTime/initialState.audioElement.duration);
//how to dispatch 'SET_PROGRESS_VALUE' now?
};
const audio = (state=initialState, action) => {
switch(action.type){
case 'SET_PROGRESS_VALUE':
return Object.assign({}, state, {progress: action.progress});
default: return state;
}
}
export default audio;
Run Code Online (Sandbox Code Playgroud) 是否有一个Subversion命令可以将工作副本"重置"到存储在存储库中的状态?类似的东西git reset --hard或(ha,硬Git重置也不会删除未版本控制的文件!)rm -rf wc && svn co <url> wc.
更新:我不是在简单的还原之后,因为它不会删除工作副本中的额外文件.我真的想要的东西与删除工作副本并再次检出它一样,只需要不必再次下载数据.(显然我不介意丢失所有未提交的更改.)
当您想要进行持续集成时,最佳分支策略是什么?
将这两种策略结合使用是否有意义?在,你为每个版本分支,但你也分支大型功能?这些策略中的一个是否与持续集成更好地结合?使用不稳定的行李箱时,使用持续集成是否有意义?
我有一个实现Swift 4的结构Codable.是否有一种简单的内置方法将该结构编码为字典?
let struct = Foo(a: 1, b: 2)
let dict = something(struct)
// now dict is ["a": 1, "b": 2]
Run Code Online (Sandbox Code Playgroud) 我可以使用类类别来覆盖已使用类别实现的方法吗?像这样:
1)原始方法
-(BOOL) method {
return true;
}
Run Code Online (Sandbox Code Playgroud)
2)覆盖方法
-(BOOL) method {
NSLog(@"error?");
return true;
}
Run Code Online (Sandbox Code Playgroud)
这会起作用,还是非法的?
我开始大量使用块很快就注意到nil块会导致总线错误:
typedef void (^SimpleBlock)(void);
SimpleBlock aBlock = nil;
aBlock(); // bus error
Run Code Online (Sandbox Code Playgroud)
这似乎违反了Objective-C的通常行为,忽略了对nil对象的消息:
NSArray *foo = nil;
NSLog(@"%i", [foo count]); // runs fine
Run Code Online (Sandbox Code Playgroud)
因此,在使用块之前,我必须采用通常的零检查:
if (aBlock != nil)
aBlock();
Run Code Online (Sandbox Code Playgroud)
或者使用虚拟块:
aBlock = ^{};
aBlock(); // runs fine
Run Code Online (Sandbox Code Playgroud)
还有其他选择吗?有没有理由为什么nil块不能简单地成为一个nop?
我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:
dispatch_sync(dispatch_get_main_queue(), block);
Run Code Online (Sandbox Code Playgroud)
但是如果我当前在主队列上运行的块中,则此调用会产生死锁.(同步调度等待块完成,但块甚至没有开始运行,因为我们正在等待当前块完成.)
显而易见的下一步是检查当前队列:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.
如果iPhone上安装了原生Facebook应用程序.如何从我的应用程序打开Facebook链接到本机Facebook应用程序.在Safari打开的情况下,链接与以下内容相同:
谢谢.