我有一个NSOperationQueue,它包含2个NSOperations,并设置为通过设置setMaxConcurrentOperationCount为1 来一个接一个地执行它们.
其中一个操作是标准的非并发操作(只是一种main方法),它同步从Web(当然是在单独的操作线程上)检索一些数据.另一个操作是并发操作,因为我需要使用一些必须异步运行的代码.
问题是我发现并发操作只有在首先添加到队列中才有效.如果它出现在任何非并发操作之后,那么奇怪的是该start方法被称为正常,但在该方法结束并且我已经设置我的连接以回调方法之后,它永远不会.之后,队列中不再执行任何操作.就好像它在start方法返回后挂起,并且没有来自任何url连接的回调被调用!
如果我的并发操作首先放入队列中,那么一切正常,异步回调工作,后续操作在完成后执行.我根本不明白!
您可以在下面看到我的并发NSOperation的测试代码,我很确定它是可靠的.
任何帮助将不胜感激!
主线观察:
我刚刚发现,如果并发操作首先在队列中,那么该[start]方法将在主线程上调用.但是,如果它不是队列中的第一个(如果它在并发或非并发之后),[start]则不在主线程上调用该方法.这似乎很重要,因为它符合我的问题模式.这可能是什么原因?
并行的NSOperation代码:
@interface ConcurrentOperation : NSOperation {
BOOL executing;
BOOL finished;
}
- (void)beginOperation;
- (void)completeOperation;
@end
@implementation ConcurrentOperation
- (void)beginOperation {
@try {
// Test async request
NSURLRequest *r = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:r delegate:self];
[r release];
} @catch(NSException * e) {
// Do not rethrow exceptions.
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Finished loading... …Run Code Online (Sandbox Code Playgroud) 我被赋予一个模块作为对象,我需要从中导入一个子模块.像这样:
import logging
x = logging
Run Code Online (Sandbox Code Playgroud)
现在,我想导入logging.handlers只使用x,而不是名称为"记录".(这是因为我正在进行一些动态导入,并且不知道模块的名称.)
我该怎么做呢?如果我这样做import x.handlers失败了.
我想更多地了解在开发iPhone/iPad应用程序时使用界面构建器的优缺点.
我已经在应用程序商店中编写了一个相当复杂且定制的应用程序,但所有接口都是手动编码的,因为它们相当复杂.我已经定制了带有背景的导航和标签栏,手动绘制了表格视图单元以提高速度,并且一些视图很复杂且可扩展且具有许多子视图.
我在考虑是否开始使用界面构建器,但我不确定我将在多大程度上使用它以及它是否值得.它更快吗?事情还能轻松定制吗?
任何建议都是最受欢迎的!
在运行一些测试时,我注意到当一个应用程序(没有后台权限,即voip,gps等)进入后台状态时,当时运行的任何后台线程(或并发NSOperations)似乎都被暂停(未终止) ,当应用程序进入前台时它们会继续.
我无法在任何地方看到此线程行为.有谁知道这种行为是否已定义且可以依靠?
如果线程可以在重新打开应用程序时安全地继续,那么不必取消任务或参与任务完成将是有用的.特别适合复杂的操作.
任何信息都会很棒.谢谢!
我有一个带有2个托管对象上下文的iphone应用程序.我的一个上下文涉及一个选择器,它允许用户添加新记录,然后选择其中一个新记录.隐藏选择器后,将保存并丢弃该托管对象上下文.
然后,我想在第二个托管对象上下文中使用此选定对象,并将其添加(关联)到另一个对象.可以保存或删除第二个MOC的更改.这就是为什么创建第一个MOC以允许始终保存拾取器中所做的更改,无论它们保存还是丢弃第二个MOC中的更改.
我希望这很清楚!我的问题是当用户从选择器中选择对象时,该对象驻留在需要使用它的不同上下文中.有没有办法可以在上下文之间传递对象?也许使用对象的ID(在它被保留之后).
谢谢你的帮助!
我即将创建一系列NSOperations并将它们运行在队列中.
它们都是顺序的并且一次运行一个.
这些操作将从Web获取数据并创建和保存核心数据管理对象.
如何处理应用程序退出的情况?由于操作在分离线程中运行,如何让主线程等到当前操作"安全"退出?在某些情况下,我很高兴线程(操作)在完成之前退出,因为在进一步的应用程序启动时,作业将继续并从中断处继续.
非常感谢,
麦克风
iphone multithreading core-data nsoperation nsoperationqueue
我目前正在提交我的应用以供审核,我已上传主屏幕截图,但我不确定如何让我的其他屏幕截图以正确的顺序显示.你必须在上传之前选择它们,并且没有任何关于它们将在何种顺序的指示!
有人可以告诉我您是否需要以正确或相反的顺序选择屏幕截图?
我的主线程上有一个NSOperationQueue运行一组NSOperations(最大并发设置为1),我希望能够随时取消.当我按下按钮时,我告诉队列取消所有操作并等到完成.这应该挂起主线程直到操作队列为空,但它会无限期地挂起我的主线程.
这是我用来阻止它的代码:
...
[myQueue cancelAllOperations];
[myQueue waitUntilAllOperationsAreFinished];
return YES; // This line never gets called
Run Code Online (Sandbox Code Playgroud)
注意:我需要使用waitUntilAllOperationsAreFinished进一步的进程要求队列为空.
奇怪的是这只发生在设备上.在模拟器中运行时,它按预期工作.
我看过断点,我可以按照当前运行的操作直到完成.它检测[self isCancelled],停止正在进行的操作并将其拉到main方法的末尾.我可以看到操作中没有任何东西导致它挂起,并且通过取消所有操作,其他任何操作都不应该启动,队列应该完成.我通过添加断点进行检查,其他操作都没有启动.
为什么会这样?
我在这里看到一些相当奇怪的东西,我dealloc在我的应用程序中设置了各种方法的断点,并且在检查时,对象的保留计数self从1到0变化.当dealloc调用时,对象的保留计数是已设为0?
我正在print (int) [self retainCount]控制台中使用它来测试它.
0似乎只出现在dealloc我NSOperation的运行中NSOperationQueue.
知道为什么会这样吗?
在与CharacterSet我合作时遇到了一个有趣的问题.从我到目前为止收集的CharacterSet是基于UnicodeScalar; 您可以使用标量初始化它并检查集合中是否包含标量.查询集合以查明它是否包含a Character,谁的字形可能由几个unicode标量值组成,这没有意义.
我的问题在于我使用表情符号测试,这是一个单一的unicode标量值(十进制128518).因为这是一个单一的unicode标量值,我认为它会起作用,结果如下:
"" == UnicodeScalar(128518)! // true
// A few variations to show exactly what is being set up
let supersetA = CharacterSet(charactersIn: "")
let supersetB = CharacterSet(charactersIn: "A")
let supersetC = CharacterSet(charactersIn: UnicodeScalar(128518)!...UnicodeScalar(128518)!)
let supersetD = CharacterSet(charactersIn: UnicodeScalar(65)...UnicodeScalar(65)).union(CharacterSet(charactersIn: UnicodeScalar(128518)!...UnicodeScalar(128518)!))
supersetA.contains(UnicodeScalar(128518)!) // true
supersetB.contains(UnicodeScalar(128518)!) // false
supersetC.contains(UnicodeScalar(128518)!) // true
supersetD.contains(UnicodeScalar(128518)!) // false
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果CharacterSet包含单个标量值(可能是由于优化),则检查有效,但在任何其他情况下,它都无法按预期工作.
我找不到任何有关较低级别实现的信息,CharacterSet或者它是否以某种编码工作(即UTF-16之类的NSString),但由于API处理很多,UnicodeScalar我很惊讶它失败了,我不确定为什么会发生这种情况,或者如何进一步调查.
任何人都可以阐明为什么会这样吗?
iphone ×6
nsoperation ×3
objective-c ×3
core-data ×2
cocoa ×1
cocoa-touch ×1
dynamic ×1
foundation ×1
import ×1
ios ×1
multitasking ×1
python ×1
swift ×1
xcode ×1