小编Sta*_*ich的帖子

是否可以检查主线程是否空闲/排出主运行循环?

我刚刚阅读了以下帖子并尝试实施那里描述的方法:

使用 Kiwi 编写 iOS 验收测试 - 敏捷

那里描述的所有东西都可以完美运行。但!当我运行验收测试时,有一件事会破坏确定性。

这是 Github 上的 repo,帖子的作者在这里推送了他的实验(可以在页面底部的评论中找到):https : //github.com/moredip/2012-Olympics-iOS--iPad-and -iPhone--source-code/tree/kiwi-acceptance-mk1

考虑他用于点击视图的这段代码:

- (void) tapViewViaSelector:(NSString *)viewSelector{
    [UIAutomationBridge tapView:[self viewViaSelector:viewSelector]];
    sleepFor(0.1); //ugh
}
Run Code Online (Sandbox Code Playgroud)

...其中sleepFor以下定义

#define sleepFor(interval) (CFRunLoopRunInMode(kCFRunLoopDefaultMode, interval, false))
Run Code Online (Sandbox Code Playgroud)

等待一小段时间直到处理完所有动画并吸收所有可能的东西是一种幼稚的尝试(“幼稚”与作者无关,而是关于它是第一个想到的事实)已(或可能)调度到主运行循环的事件(另请参阅此评论)。

问题是这个简单的代码不能以一种确定性的方式工作。有一堆 UI 交互导致在当前编辑的文本字段的键盘消失之前按下 fx next 按钮点击,等等......

如果我只是将时间从 0.1 增加到 fx 1,所有问题都会消失,但这会导致每一次交互,例如“用文本填充文本字段...”或“点击带有标题的按钮...”都会花费一个第二!

所以我的意思不是仅仅增加这里的等待时间,而是一种使这种人为等待保证我可以继续下一步的测试用例的方法。

我希望它应该是一种更可靠的方法,可以等到所有由当前操作(所有转换/动画或任何主运行循环的东西)引起的东西都完成为止。

总结一下就是一个问题:

有没有办法排空/排空/浸泡所有调度到主线程及其运行循环的东西,以确保主线程空闲并且其运行循环是“空的”?

这是我最初的解决方案:

// DON'T like it
static inline void runLoopIfNeeded() {
    // https://developer.apple.com/library/mac/#documentation/CoreFOundation/Reference/CFRunLoopRef/Reference/reference.html

    while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, YES) == kCFRunLoopRunHandledSource);

    // DON'T like it
    if (CFRunLoopRunInMode(kCFRunLoopDefaultMode, …
Run Code Online (Sandbox Code Playgroud)

objective-c runloop ios

5
推荐指数
2
解决办法
2746
查看次数

我可以在不同的线程上使用相同的EKEventStore实例吗?

我想知道EKEventstore在不同的线程上使用单个实例是否安全?我在任何地方都找不到任何相关的东西.

我打算EKCalendar在每个线程上获得一个唯一的实例.

ekeventstore

5
推荐指数
1
解决办法
601
查看次数

testb指令的含义是什么?

谁能告诉我以下的含义:

gdb> disas 0x080ed5af 

0x080ed5ac <func1+205>:        mov    0x8(%eax),%eax

0x080ed5af <func1+208>:        testb  $0x10,0x8(%eax)

0x080ed5b3 <func1+212>:        jne    0x80ed604 <dapriv_disk_op+293>

0x080ed5b5 <func1+214>:        mov    %edi,(%esp)
Run Code Online (Sandbox Code Playgroud)

是什么意思testb $0x10,0x8(%eax)

gdb

5
推荐指数
1
解决办法
5786
查看次数

在Windows上创建p12 iOS开发人员证书 - 最后一步出错

所以,我一直在寻找很多如何为iPhone开发创建一个p12文件,我想我正在做我应该做的,但在最后一步我得到一些或多或少不可能的错误破译.

我正在运行Windows 7,这些是我要做的步骤:

1)创建私钥.我通过运行此命令来执行此操作(cmd在管理员模式下打开):

openssl genrsa -out mykey.key 2048

2)创建CSR文件

openssl req -new -key mykey.key -out developer_identify.csr

3)将csr文件上传到iPhone开发站点.我在这里做以下事情:

  • 单击菜单标识符 - >应用程序ID,选择正确的应用程序ID,单击编辑,单击创建证书,单击继续,选择上面创建的CSR文件并继续.等待网站告诉我一切正常,然后下载*aps_development.cer*文件.

4)创建PEM文件:

openssl x509 -in aps_development.cer -inform DER -out developer_identity.pem -outform PEM

5)最后,创建p12文件(这是它失败的地方):

openssl pkcs12 -export -inkey mykey.key -in developer_identity.pem -out iphone_dev.p12

最后一个命令后的输出:

Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:
8216:error:060740A0:lib(6):func(116):reason(160):NA:0:
8216:error:23077073:lib(35):func(119):reason(115):NA:0:
8216:error:2306C067:lib(35):func(108):reason(103):NA:0:
8216:error:23073067:lib(35):func(115):reason(103):NA:0:
Run Code Online (Sandbox Code Playgroud)

p12文件是0字节.

PEM文件看起来没问题,首先是

-----BEGIN CERTIFICATE----- 
then a lot of jibberish and then ends with
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

openssl certificate ios

5
推荐指数
0
解决办法
1336
查看次数

如何通过调度并发队列(GCD)实现可重入锁定机制?

我刚读过这篇文章,其解决方案似乎令人信服:

  • 串行队列用于同步访问
  • dispatch_get_specific/dispatch_set_specific用于提供重入功能.

我感兴趣的是,如果有可能推动这一方案来实现重入锁定机制并行调度队列(每次读取使用dispatch_sync做,写使用dispatch_barrier_async做,等进行了说明这里,看到"一个资源,多个读卡器,和一个单一的作家").

PS我想我已经设法在[NSThread currentThread].threadDictionary 这里实现了这个,但我不喜欢处理[NSThread currentThread]因为我依赖GCD.是否有可能[NSThread currentThread].threadDictionary用一些棘手的dispatch_set_specific/dispatch_get_specific代码替换使用?

objective-c grand-central-dispatch

5
推荐指数
1
解决办法
985
查看次数

有没有机会针对EKEventStore编写单元测试?

我们正在我们的应用程序中实现"同步到日历"功能.我们的同步过程涉及我们从服务器端获取的要复制到iPhone日历的事件.目前我不确定我们为此同步编写的方法是否解决了我们期望的所有可能情况,这就是我想要对其进行单元测试的原因.它包含许多对EKEventStore的调用,正如Apple文档所述,需要首先调用它requestAccessToEntityType:completion::

在iOS 6及更高版本中,必须在使用requestAccessToEntityType:completion:初始化事件存储后请求访问实体类型才能返回数据.

......在我们运行单元测试的环境中很难处理.

目前我正在考虑使用EKEvent对象的一些NSArray来实现EKEventStore的mock子类.

是否有可能对EKEventStore进行单元测试而不编写这样的模拟子类,它会模仿我们在同步例程中使用的所有方法?

objective-c ios ekeventstore

5
推荐指数
1
解决办法
767
查看次数

OCaml中的递归函数

我有一点问题:我想用OCaml 解决这个问题,所以我尝试了这个 - >

-> let rec somme x = if ( nor (bool_of_int (x mod 3)) (bool_of_int (x mod 5))) then x + (somme x-1) else (somme x-1) ;;

val somme : int -> int = <fun>

-> somme 1000 ;;

Stack overflow during evaluation (looping recursion?).
Run Code Online (Sandbox Code Playgroud)

我做错了什么?


我试过的新代码:

let somme2 x = if (( nor (bool_of_int (x mod 3)) (bool_of_int (x mod 5)))) then x + somme (x-1) else somme (x-1) ;;

let somme x = …
Run Code Online (Sandbox Code Playgroud)

stack-overflow recursion ocaml

4
推荐指数
1
解决办法
5995
查看次数

如何正确扩展 Rails Engine 的控制器?

我正在开发名为 Carrier ( https://github.com/stanislaw/carrier ) 的Rails 插件(它是 3.1 引擎)。

在我的一个 rails 应用程序中,我想用一些新方法扩展 Carrier 的控制器 - fx。将新操作 #comment_form 添加到 Carrier::MessagesController(我希望此操作仅存在于我的应用程序中 - 我不想将其添加到引擎中 - 因为它非常具体)。

我在这里看到的两种策略:

1)我将{Carrier's plugin root}/app/controllers/carrier/messages_controller.rb文件复制到我的应用程序的app/controllers/carrier/文件夹中,然后扩展它(所有插件的原始操作也被复制到rails应用程序控制器文件夹中! )。

2)我想要的更准确的方法 - 只是创建 {My rails app}/app/controllers/carrier/messages_controller.rb 并只写#comment_form 方法,我希望 Carrier 扩展。

期望两个控制器的内容(来自插件文件夹+自定义在我的 Rails 应用程序中只有新的#comment_form)会叠加,我尝试了第二种方式。但是 Rails 然后停止识别来自 Carrier 插件文件夹的 messages_controller.rb 中写入的所有原始 Carrier 操作(#index、#show 等...),并开始将 Rails 应用程序的 messages_controller.rb 版本视为唯一一个(所有原始操作都开始处理为空,因此开始通过 Rails 约定的默认流程呈现)。

所以我的一般问题是:如何将新操作添加到 Rails Engines 控制器而不将它们完全复制到 Rails app/controllers 文件夹?

UPD

现在,我看到了两种解决方案,它们允许在没有严重黑客攻击的情况下扩展引擎的控制器(就像这个 gem 所做的那样:https : //github.com/asee/mixable_engines来自这个线程:在主应用程序中扩展 Rails 3 引擎的控制器

1) 在 #{main_app}/app/controller/your_engine 文件夹中的 …

ruby-on-rails ruby-on-rails-plugins rails-engines ruby-on-rails-3.1

4
推荐指数
1
解决办法
3321
查看次数

Docker中的调试限制是什么?

我正在调试一个编译的(c ++)python模块,它在docker容器内的导入时神秘地崩溃.当我在里面运行python3 gdb,然后导入,然后尝试打印回溯,我只得到

# gdb /usr/bin/pyton3
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.
...
(gdb) run -c 'import myModule'
warning: Error disabling address space randomization: Operation not permitted
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb) bt
No stack.
(gdb)
Run Code Online (Sandbox Code Playgroud)

在Docker容器中gdb可以(不)做什么限制?崩溃本身令人惊讶,但无法进行调试更是如此.编译模块-ggdb2以包含尽可能多的调试信息.

debugging gdb docker

4
推荐指数
1
解决办法
981
查看次数

我可以选择禁用这两个MISRA规则:每个函数一个语句和强制函数原型吗?

我们公司现在是ISO-13485(医疗设备),并希望使用MISRAC2012.我阅读了标准,但如果我认为可以提高稳定性和可读性,我无法弄清楚是否可以禁用某些规则.

两个例子:

MISRA每个函数只允许1个return语句.这通常会导致嵌套的条件结构看起来像圣诞树.我真的不认为这个规则会增加安全性,因为它会降低代码的可读性并且更容易出错.

MISRA只接受具有原型的功能,即使是静态功能.这允许程序员将其功能放在文件中的任何位置而不考虑调用顺序.没有原型,main函数必须是文件中的最新函数,并且多函数递归是不可能的,因为函数只能调用上面声明的函数.

如果我想禁用这两个规则,我可以这样做吗?有客户会因此而责怪我吗?

c misra

4
推荐指数
1
解决办法
615
查看次数