我发布这个问题,因为我看到很多关于这个主题的混淆,我花了几个小时调试NSOperation子类作为结果.
问题是,当您执行异步方法时,NSOperation对您没有多大帮助,这些异步方法在异步回调完成之前实际上并不完整.
如果NSOperation本身是回调委托,由于在不同的线程上发生回调,它甚至可能不足以正确完成操作.
假设您在主线程中并创建了一个NSOperation并将其添加到NSOperationQueue,NSOperation中的代码会触发异步调用,该调用将调用AppDelegate或视图控制器上的某些方法.
您无法阻止主线程或UI将锁定,因此您有两个选项.
1)创建一个NSOperation并使用以下签名将其添加到NSOperationQueue:
[NSOperationQueue addOperations:@ [myOp] waitUntilFinished:?]
祝你好运.异步操作通常需要一个runloop,因此它不会工作,除非你继承NSOperation或使用一个块,但是如果你必须通过在回调完成时告诉它来"完成"NSOperation,那么即使一个块也不会工作.
所以......你用类似于下面的东西对NSOperation进行子类化,这样回调可以告诉操作何时完成:
//you create an NSOperation subclass it includes a main method that
//keeps the runloop going as follows
//your NSOperation subclass has a BOOL field called "complete"
-(void) main
{
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
//I do some stuff which has async callbacks to the appDelegate or any other class (very common)
while (!complete && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
}
//I also have a setter that the …Run Code Online (Sandbox Code Playgroud) 许多(如果不是大多数)Web服务对客户都有速率限制.Delicious说客户每秒可以提出一个请求; Twitter每个终点都有限制; 我确信Facebook和Flickr以及Foursquare都有自己的想法.
您可以使用a一次轻松地将iOS应用程序限制为单个请求NSOperationQueue.
但是,如何将应用程序限制为每秒只生成一个请求?
我查看过Apple,AFNetworking,ASINetwork和其他一些代码的示例代码,似乎都没有解决这个问题.这对我来说似乎很奇怪.我会承认我可能会遗漏一些非常明显的东西......
一些参数:
NSOperationQueue用于网络操作并且请求是一个NSOperation(我想也可能是一个GCD队列,但这是我一直在使用的)可能的解决方案:
sleepNSOperation(这是一个队列/线程中的语句,所以这不会阻止其他任何东西)NSTimer 在里面 NSOperationperformSelector:在NSOperation(我修补ASINetworking使用这种方法,虽然我没有使用它,并没有推动上游的变化)NSOperation.这将是下一个网络操作将依赖的任务这些看起来都很混乱.睡眠的操作可能会阻止形式的"优先级"队列.启动/停止队列似乎很脆弱.忽略限制是粗鲁的.
要清楚,我已经解决了这个问题.但解决方案似乎"凌乱"而且有些脆弱.我想知道是否有更好,更清洁的选择.
想法?
在对我之前发布的iPad应用程序进行更新后,我收到的报告显示,人们无法在不删除和重新安装的情况下实际更新应用程序.但是,据我所知,更新中的任何内容都不应导致此问题.(所有更新处理都是让人们通过电子邮件发送PDF文档,没什么大不了的.)当人们尝试更新时,他们会被要求提供他们的iTunes密码,但在输入后,它只会返回到更新屏幕,没有任何反应.此外,似乎这只发生在我的应用程序中,有问题的人与App Store上的其他各种应用程序没有任何问题.有谁知道可能导致这种情况的原因以及我如何解决这个问题?
提前致谢!
(此外,如果重要,该应用程序是一个自定义的B2B应用程序,一般公众不能购买它.)
我的问题源于在尝试构建多个位深度平台(例如32/64)时尝试使用printf来记录事物.
一直在养成丑陋头脑的问题是试图在多种体系结构上打印.在32位上它会是这样的
printf(" my int: %d\n", myInt);
Run Code Online (Sandbox Code Playgroud)
但在64位上,它必须改为
print (" my int: %ld\n", (long)myInt);
Run Code Online (Sandbox Code Playgroud)
我有两个相关的问题:
我的第一个想法是,当你告诉printf打印一个变量,给它一个格式时,它会查看该变量的地址并获取该格式所需的字节数.这一开始似乎是个大问题.例如,如果你有一个变量myChar,它是一个char(1个字节),但使用了%d的格式说明符,那将告诉printf转到myChar的地址并获取接下来的4个字节,将其视为int.如果是这种情况,似乎printf会从相邻变量中获取垃圾日期(因为它抓取了4个字节,但实际值只有1个字节).然而,情况似乎并非如此.通过使用myChar并指定%d,printf抓取1个字节,然后用0表示填充高3个字节.我的理解在这里是否正确?
如果上述情况属实,那么始终将变量提升到最大值是否有任何真正的危害,以避免在32/64位情况下出现的问题类型.例如,如果你有一个短变量myShort和一个int变量myInt,那么打印它们总是有任何缺点:
printf("myShort%ld",(long)myShort); printf("myInt%ld",(long)myInt);
谢谢你的任何澄清.
我想知道在java中是否有可能有一个实现Runnable的类,如果该类的对象进入wait()(所以线程停止运行直到它收到一个信号),同一个类的另一个对象可以通知它继续跑步?
理想情况下,我希望能够做到的是:
public class ThreadClass implements Runnable{
public void run(){
//.. Does some arbitrary work
if( aCondition){ //have it wait until something signals it to contine exection.
this.wait();
}
//Continues to do more work.
//finished whatever it needed to do. Signal all other threads of this object type to continue their work.
this.notifyAll();
}
}
Run Code Online (Sandbox Code Playgroud)
这是可能的,如果是这样,我该怎么做呢?我试图使它成为对象本身可以管理自己和所有其他相同类型的对象.所以没有人使用这个类必须担心管理它.
你有没有遇到过这样的问题,你所做的改变只是反映在模拟器而不是设备上?
例如,如果我想为表格单元格设置所选的背景图像视图,则模拟器中的选择状态将显示更改,但在测试期间不会显示在设备上.
这种不一致性开始让我担心,因为在部署到生产时,我怎么知道应用程序商店中的应用程序才能正常工作?
谢谢
我正在尝试使用OpenCV的imread()函数在a中加载JPEG图像cv::Mat,但它在iOS上失败(相同的代码适用于OS X).返回的矩阵已分配且有效,但为空(即它不包含任何数据).
在iOS下执行功能imread()和imwrite()工作吗?
我希望我的Spring Controller能够缓存返回的内容.我发现了很多关于如何禁用缓存的问题.我想知道如何启用缓存.我的控制器看起来像这样:
@Controller
public class SimpleController {
@RequestMapping("/webpage.htm")
public ModelAndView webpage(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mav = new ModelAndView("webpage");
httpServletResponse.setHeader(“Cache-Control”, “public”);
//some code
return mav;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我添加了以下行:httpServletResponse.setHeader(“Cache-Control”, “public”);设置缓存,但在刷新此页面的浏览器中,我仍然得到相同的状态结果:200 OK.我怎样才能达到效果304 not modified?我可以@ResponseStatus(value = HttpStatus.NOT_MODIFIED)在这个方法上设置注释,但它只是状态还是实际的缓存?
通过http://www.icodeblog.com/2011/04/07/creating-static-libraries-for-ios/后,我创建了一个静态库.为了测试这个库我创建了一个新项目并将静态库拖到项目上并尝试测试它的一个方法.但它给了我错误""_OBJC_CLASS _ $ _ MyLib",引自:".MyLib是我创建的库的名称.
我创建静态库的步骤.1.创建了一个新的Xcode项目.2.选择创建cocoa touch静态库的选项.3.在MyLib.h中编写了两个函数,并为fibonacci系列编写了一个实现,并为生成一个数字的阶乘编写了其他函数.3.构建项目并单击MyLib.a文件,并在finder中显示部分.4.将MyLib.a文件和MyLib.h拖到名为MyLib的新文件夹中.
请帮忙
我试图添加一个没有边框的UISearchBar,但它根本不起作用.
这就是我所拥有的:
在XIB文件中,我添加了UISearchBar.风格=黑色透明.Tint =默认.没有选择任何选项(书签,取消按钮,范围栏等).背景=默认.Drawing = opaque(基本上是UISearchBar的默认设置).
我有一个UISearchBar的属性 - searchBar.在实现文件中,当视图加载时,我有:
[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
但无论出于何种原因,背景(盒子周围的黑色边框)根本就没有.我试过[[self.searchBar.subviews objectAtIndex:0] setAlpha:0],但这根本不起作用.
有什么帮助吗?
ios ×6
iphone ×3
objective-c ×3
java ×2
xcode ×2
c ×1
caching ×1
frameworks ×1
logging ×1
notify ×1
opencv ×1
printf ×1
runnable ×1
spring ×1
spring-mvc ×1
static ×1
uisearchbar ×1
wait ×1