我在Xcode 5的新XCTest框架中编写了一些单元测试.
该测试似乎成功地通过大部分的时间,但我遇到一个奇怪的行为在那里,如果我进行的测试,足够的时间连续,最终我会得到一个"试验失败"的消息,控制台也将展示Program ended with exit code 0,但也有所有测试旁边的绿色复选标记.
这里出了什么问题?
非常简单的情况.不知道为什么会导致问题.
我有一个视图,在子NSManagedObjectContext中创建一个新的NSManagedObject.当用户按下"完成"时,它保存子上下文,然后保存父上下文,然后使用新创建的对象的objectID发布通知.在主视图控制器中,我响应通知并尝试获取新创建的对象existingObjectWithID:error:.
问题是失败,因为objectID是临时的(我得到"Cocoa错误133000").保存到两个上下文是完美的:当我重新加载应用程序时,我可以看到我创建的条目.但是当我需要获得对新对象的引用时,它失败了.
在我保存之后,为什么它会给我一个临时对象ID ?
注意:我尝试过使用obtainPermanentIDsForObjects:error:,但是当我尝试使用它来获取对象时,永久ID仍然失败.
这是一些代码:
-(IBAction)done:(id)sender
{
if ([editorDoneNotification isEqualToString:kNOTIFICATION_OBJECTADDED]) {
// save the temporary moc
NSError* e;
if (![self.tempContext save:&e]) { // this is always a successful save
NSLog(@"Failed to save temporary managed object context: %@", [e localizedDescription]);
[[[UIAlertView alloc] initWithTitle:@"Database Error"
message:@"Failed to add object."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
}
}
NSError* e;
if (![[[AMDataModel sharedDataModel] mainContext] save:&e]) { // this is also successful
NSLog(@"Failed to save main managed …Run Code Online (Sandbox Code Playgroud) 在Xcode中,有没有办法让我自动运行一个测试用例n次?
这样做的原因是我的一些beta测试人员在我的应用程序中遇到随机崩溃.我在TestFlight中看到崩溃日志以及堆栈跟踪,但我无法重现崩溃.
崩溃很少发生,但是当它发生时,它总是在用户尝试创建数据库记录时发生,然后上传到服务器.崩溃日志的问题是我的代码没有在他们的堆栈跟踪中出现(所有UIKit和CoreFoundation的东西 - 每次都不同).
我的解决方案是为应用程序的那部分运行测试100次,并设置异常断点,以尝试在我的开发环境中触发错误.但我不知道如何自动执行此操作.
我有一个基于地图的应用程序,使用谷歌地图的iOS SDK.我需要在核心数据数据库中存储多达数千个项目,并在地图上显示标记.出于性能和可用性的原因,我需要在用户缩小时对这些标记进行聚类,但我需要确保放置代表性标记,以便用户知道放大的位置以查看更多细节.
我的核心数据模型中的每个条目都存储了纬度/经度双值.因此,我想要对项目进行聚类的是保留一个单独的实体,我在其中剥离地理坐标的不太重要的部分并在其中存储计数.
因此,每当在数据库中插入具有lat/lon {44.9382719,-130.20293849}的项目时,具有lat/lon {44.9,-130.2}的另一个"集群"对象的计数属性会递增.我的想法是,在低缩放(即缩小)时,我只会查询群集对象并将其放在地图上而不是实际的项目上.
我的问题是:根据NSManagedObject引用,你不应该获取内容awakeFromInsert,那么我如何确保插入一种托管对象更新另一种相应托管对象的值?
我有两个NSManagedObjectContext名字importContext和childContext.childContext是他们的孩子importContext,他们俩都是NSPrivateQueueConcurrencyType.
为了避开主线程,我正在对importContext队列进行大量工作.这项工作涉及大量取的并保存,所以它的方便来包装整个事情里面performBlockAndWait:的importContext(它不会被同步操作需要,因为我以后有代码performBlockAndWait依赖于它的结果).
在这项工作中的某些时候,我可能需要从JSON结果创建新的托管对象.这些JSON值可能无效并且我的验证失败,因此在创建对象后,如果它们不好,我需要能够抛弃它们.这就是childContext进来的地方.我将新对象插入其中,如果它的JSON属性最终没有意义,我就放弃了childContext.
当我需要保存时,问题就来了childContext.我希望它有自己的私有队列,与父队列分开.但是,这会导致iOS 7(不是iOS 8)上的死锁.当我在iOS 8模拟器和设备上运行相同的代码时,childContext它会在单独的线程上创建自己的队列并正确进行保存.
看起来当我运行iOS 7时,它childContext正在尝试save:在父队列中进行,但是父进程正在等待其子进程导致死锁.在iOS 8中,这不会发生.有谁知道为什么?
这是简化的代码:
-(NSManagedObjectContext *)importContext
{
NSManagedObjectContext* moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.persistentStoreCoordinator = [self storeCoordinator];
return moc;
}
-(void)updateItems:(NSArray*)ItemDescriptions
{
[self.importContext performBlockAndWait:^{
//get info and update
...
...
if(needToCreateNewItem){
NSManagedObjectContext* childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取一组项目(结构)并使用 SwiftUI 将它们显示在分组表视图中。
我的(简化的)模型如下所示:
struct CheckIn: Identifiable {
...
let id = UUID()
let date = Date().atMidnight // removes the time component
var completed: Bool
...
}
class Store: ObservableObject {
@Published var checkIns = [...] {
didSet { persist() }
}
}
Run Code Online (Sandbox Code Playgroud)
在列表中显示签到之前,我想按日期对它们进行分组。所以我有另一个模型:
struct DailyCheckIns {
let date: Date
let checkIns: [CheckIn]
}
// and a function to group the check-ins array:
func groupByDate(_ checkIns: [CheckIn]) -> [DailyCheckIns] {...}
Run Code Online (Sandbox Code Playgroud)
视图是我遇到问题的地方。下面的版本可以工作,但数据没有明显分组。我所说的“有效”是指数据被传入CheckInView并且它可以更新其签入,然后正确地反映在商店和 UI 中。
struct ContentView: View {
@EnvironmentObject …Run Code Online (Sandbox Code Playgroud) 我正在开发一个基于企业地图的应用程序,它需要显示从大量劳动力收集的信息,并将其全部显示在每个员工的 iPad 上。因此,地图上的标记数量会迅速增加(数以千计)。此外,每个标记都将由一个 NSManagedObject 子类支持,该子类在标记存在时保存在内存中。
我正在使用 Google Maps iOS SDK,问题是,即使没有任何标记,只是平移和缩放会导致内存使用量大幅增加。启动时应用程序的脏内存大小为 100MB(使用分配工具)。一点点平移和缩放很快使它最多可以拍摄到 300,问题是当我停止平移和缩放时,内存永远不会下降。类似地,如果我打开了很多标记并删除它们,同样不会降低内存(当我删除标记时,我确保也不保留对任何对象的任何引用)。内存下降的唯一时间是我更改地图类型时。如果我在街景视图中平移/缩放很多,然后切换到卫星视图,脏内存会突然下降 50MB 以上。
所以我想知道是否有人在使用谷歌地图时有任何处理内存的技巧,或者关于谷歌地图如何管理/释放内存的任何信息?
google-maps memory-management ios automatic-ref-counting google-maps-sdk-ios
我有一个NSManagedObject的子类,有一些"整数32"属性,真的是枚举.这些枚举在我的模型的.h文件中定义,如下所示:
typedef enum {
AMOwningCompanyACME,
AMOwningCompanyABC,
AMOwningCompanyOther
} AMOwningCompany;
Run Code Online (Sandbox Code Playgroud)
我需要显示一个表视图,显示此自定义对象的每个属性的值,因此对于每个枚举,我有一个看起来像这样的方法来返回字符串值:
-(NSArray*)stringsForAMOwningCompany
{
return [NSArray arrayWithObjects:@"ACME Co.", @"ABC Co.", @"Other", nil];
}
Run Code Online (Sandbox Code Playgroud)
在我的表视图中,我遍历my的属性NSManagedObject(使用NSEntityDescription's' attributesByName和每个属性我调用一个调用相应"stringsFor"方法的辅助方法来返回该特定属性的字符串:
-(NSArray*)getStringsArrayForAttribute:(NSString*)attributeName
{
SEL methodSelector = NSSelectorFromString([self methodNameForAttributeNamed:attributeName]);
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:[[AMProperty class] instanceMethodSignatureForSelector:methodSelector]];
[invocation setSelector:methodSelector];
[invocation setTarget:self.editingPole];
[invocation invoke];
NSArray* returnValue = nil;
[invocation getReturnValue:&returnValue];
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
我的表格视图cellForRowAtIndexPath如下所示:
...
NSString* itemName = self.tableData[indexPath.row];
NSAttributeDescription* desc = itemAttributes[itemName];
NSString* cellIdentifier = [self cellIdentifierForAttribute:desc]; // checks the attribute type and …Run Code Online (Sandbox Code Playgroud) 关于如何解决有利于一个或另一个分支的合并冲突的 SO 有很多问题。但我找到的最常见的答案是使用git checkout --oursor git checkout --theirs。
问题是将从任一分支git checkout获取整个文件。文件的某些部分可能合并得很好,我们不希望它们被删除。
所以问题是:给定一个处于冲突状态的文件,是否有一种方法可以删除冲突标记以支持“我们的”或“他们的”,而无需将此策略应用于整个合并或从“我们的”中获取整个文件或“他们的”?
使用简单的脚本绝对可以做到这一点,但我想知道是否有我找不到的现有解决方案。
我有一个自定义的UITableViewCell,UISegmentedControl右侧的左侧有一个标签.我刚刚习惯在代码中使用自动布局,这就是我在自定义单元格中使用的内容(使用UIView + AutoLayout):
-(void)updateConstraints
{
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.segmentedControl.translatesAutoresizingMaskIntoConstraints = NO;
[self.titleLabel pinToSuperviewEdges:JRTViewPinLeftEdge inset:DB_AUTOLAYOUT_DEFAULT_INSET];
[self.titleLabel centerInContainerOnAxis:NSLayoutAttributeCenterY];
[self.segmentedControl pinToSuperviewEdges:JRTViewPinRightEdge inset:DB_AUTOLAYOUT_DEFAULT_INSET];
[self.segmentedControl pinAttribute:NSLayoutAttributeBaseline
toAttribute:NSLayoutAttributeBaseline
ofItem:self.titleLabel];
[super updateConstraints];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是分段控件的第一个标题始终未对齐:
这就是它在iOS 6上的样子: 
在iOS 7上: 
所以第一个问题是:我该如何解决这个问题?
其他,切向问题:我是通过放入自动布局代码做正确的事情updateConstraints还是应该只应用约束一次?
ios ×9
objective-c ×4
core-data ×3
google-maps ×2
xctest ×2
autolayout ×1
concurrency ×1
debugging ×1
git ×1
malloc ×1
nsinvocation ×1
swift ×1
swiftui ×1
swiftui-list ×1
unit-testing ×1
xcode ×1
xcode5 ×1