小编the*_*jaz的帖子

将UUID作为PostgreSQL中的主键会给出糟糕的索引性能吗?

我使用PostgreSQL数据库在Heroku上的Rails中创建了一个应用程序.

它有几个表,可以与移动设备同步,可以在不同的地方创建数据.因此,我有一个uuid字段,除了自动增量主键之外,还是一个存储GUID的字符串.uuid是服务器和客户端之间通信的那个.

我意识到在服务器端实现同步引擎后,当需要在uuid < - > id之间进行映射时,这会导致性能问题(在编写对象时,我需要在保存之前查询uuid以获取id)发送回数据时相反).

我现在正在考虑切换到仅使用UUID作为主键,使写入和读取更加简单和快速.

我已经读过UUID作为主键有时会在使用聚簇主键索引时产生错误的索引性能(索引碎片).PostgreSQL是否遇到此问题或者使用UUID作为主键是否可以?

我今天已经有了一个UUID列,因此存储方式会更好,因为我删除了常规id列.

ruby postgresql ruby-on-rails heroku

59
推荐指数
1
解决办法
2万
查看次数

核心数据嵌套的托管对象上下文和频繁的死锁/冻结

我有一个问题几乎与此人描述的问题相同,但它没有得到答案:

http://www.cocoabuilder.com/archive/cocoa/312683-core-data-nested-managed-object-contexts-and-frequent-deadlocks.html#312683

这是问题所在:

我有一个使用NSPrivateQueueConcurrencyType和持久性存储协调器集的父MOC设置,它有一个带有NSMainQueueConcurrencyType的子MOC设置.大多数长期努力工作和保存的想法可以在私有MOC上完成,从而使主线程阻止UI.不幸的是,我似乎遇到了导致死锁的几种情况.

如果子MOC(在主线程上)正在使用NSFetchedResultsController执行提取,则会向父上下文发送-executeFetchRequest:它可以创建死锁.这两个操作都是在performBlock的上下文中完成的:对于它们各自的MOC,尽管文档似乎表明在没有performBlock的主线程上使用主线程并发类型MOC是好的.

看起来私有队列正在等待主线程上的子上下文已经锁定的PSC锁.看起来子上下文(在持有PSC锁定时)试图将dispatch_sync分配给父上下文,因此它们都在等待彼此.

是PriveQueue - > MainQueue是支持的配置吗?似乎大多数人仍然在主线程上有父上下文.

主线程看起来像这样:

> #0    0x960f6c5e in semaphore_wait_trap ()
> #1    0x04956bb5 in _dispatch_thread_semaphore_wait ()
> #2    0x04955c8f in _dispatch_barrier_sync_f_slow ()
> #3    0x04955dea in dispatch_barrier_sync_f ()
> #4    0x01797de5 in _perform ()
> #5    0x01798547 in -[NSManagedObjectContext(_NestedContextSupport) newValuesForObjectWithID:withContext:error:] ()
> #6    0x0176416b in _PFFaultHandlerLookupRow ()
> #7    0x01763f97 in -[NSFaultHandler fulfillFault:withContext:forIndex:] ()
> #8    0x01763b75 in _PF_FulfillDeferredFault ()
> #9    0x017639f2 in _sharedIMPL_pvfk_core ()
> #10    0x017681a0 in _pvfk_11 ()
> …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsfetchedresultscontroller nsmanagedobjectcontext ios

30
推荐指数
1
解决办法
1万
查看次数

使用与Devise on Rails分开的身份验证模型

我有一个简单的解决方案,我已经使用以下对象:

  • 帐户(具有令牌字段,在API调用中进行身份验证和使用时返回)
  • 身份验证(具有auth_type/auth_id和对帐户的引用)

我有一个单独的身份验证模型,可以连接多种登录方式(设备UUID,电子邮件/密码,Twitter,Facebook等).但似乎在Devise的所有示例中,您都在用户(帐户)模型上使用它.

这不是那么灵活吗?例如,OmniAuth模块在User模型上存储提供者和ID ,如果您希望能够从Twitter和Facebook登录,会发生什么?只有一个提供者的空间?

我应该在帐户模型或身份验证模型上使用Devise 吗?

ruby ruby-on-rails devise omniauth ruby-on-rails-3

11
推荐指数
1
解决办法
2056
查看次数

NSDecimalNumber decimalNumberWithString:忽略当前的语言环境

根据文档,[NSDecimalNumber decimalNumberWithString:]应使用locale小数分隔符:

NSDecimalSeparator是句点(例如,在美国使用)还是逗号(例如在法国使用)取决于默认语言环境.

但是当我尝试它时,这段代码:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);
Run Code Online (Sandbox Code Playgroud)

给...

100
100.1
Run Code Online (Sandbox Code Playgroud)

...作为iOS 5和iOS 6的输出.我尝试使用瑞典语和法语作为区域设置,因为这两个国家都使用逗号(,)作为小数分隔符.

输出应该不一样吗?

(我知道我可以使用[NSDecimalNumber decimalNumberWithString:locale:]来强制行为,所以这个问题不是关于找到替代方案,只是如果这是一个错误或我做错了什么)

cocoa-touch objective-c nsdecimalnumber ios

10
推荐指数
1
解决办法
4278
查看次数

NSURLConnection - 禁用身份验证质询响应机制

情况

  • 使用AFNetworking(NSURLConnection)访问我的服务器API
  • API需要使用令牌作为用户名的基本身份验证
  • 当令牌无效时,API返回HTTP 401
  • 我在任何请求之前设置了基本身份验证标头
  • 如果它返回401,我重试如下:

    AFHTTPRequestOperation *requestOperation = [MyHTTPClient.sharedClient HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        processSuccessBlock(operation, responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        processFailureBlock(operation, error);
    
        if (operation.response.statusCode == 401)
            [MyHTTPClient.sharedClient refreshTokenAndRetryOperation:operation success:processSuccessBlock failure:processFailureBlock];
    }];
    
    Run Code Online (Sandbox Code Playgroud)

问题

  • 当服务器返回带有基本身份验证质询的HTTP 401时,AFNetworking/NSURLConnection会发送两次相同的请求(初始请求,然后回应身份验证质询)
  • 但由于上面的代码,我自己处理HTTP 401,这是完全没必要的 ,我希望它停止自动回答身份验证挑战

我做了什么

  • 与响应cancelAuthenticationChallenge:willSendRequestForAuthenticationChallenge:被中止第二个电话,但它给出了错误代码-1012(NSURLErrorUserCancelledAuthentication),而不是401和掩盖了真实的反应

如何禁用身份验证质询响应机制,以便在不调用它的情况下获得服务器响应?

cocoa-touch objective-c nsurlconnection ios afnetworking

9
推荐指数
1
解决办法
4398
查看次数

在设置值之前等待现有的iCloud值?

在我的应用程序中,我需要在运行应用程序的不同设备之间共享设置.我想要安装应用程序的第一个设备来设置设置的主值,然后所有其他设备应该获得该设置而不是覆盖它.

  1. 在设置值之前,如何确保首先检查iCloud是否有值?所以我不会覆盖现有的.

  2. 我应该等待发送NSUbiquitousKeyValueStoreInitialSyncChange事件,然后我可以检查最终的现有值,否则第一次设置它?如果是,我可以依赖接收NSUbiquitousKeyValueStoreInitialSyncChange事件吗?如果没有,那么可能会发现它没有使用这种方法设置iCloud值.

  3. 如果我在第一次触发NSUbiquitousKeyValueStoreInitialSyncChange之前尝试设置一个值,它是否会被丢弃,然后NSUbiquitousKeyValueStoreInitialSyncChange将被存储中的现有数据触发?

  4. 我听说如果第一次同步时商店中没有值,则不会触发NSUbiquitousKeyValueStoreInitialSyncChange?

我已经阅读了关于这个的Apple文档,并在Stack Overflow上看到了答案,但是不明白如何做到这一点.

如何在第一次启动/安装应用程序时确保不覆盖现有值?

objective-c ios ios5 icloud nsubiquitouskeyvaluestore

8
推荐指数
1
解决办法
957
查看次数

使用Google App Engine中的关系数据对多对多进行建模

我的应用程序中有两个模型,Transaction和Person,具有多对多关系.每笔交易都包含人员.对于每个人,还有与该人员所连接的每个交易相关的金额.因此,我需要模拟与关系数据的多对多关系.谷歌建议这种方法:

http://code.google.com/intl/sv-SE/appengine/articles/modeling.html

通过这种方法,我有一个这样的模型:

class TransactionPerson(db.Model):
    # References
    transaction = db.ReferenceProperty(Transaction, required=True)
    person = db.ReferenceProperty(Person, required=True)
    # Values
    amount = db.FloatProperty(required=True)
Run Code Online (Sandbox Code Playgroud)

但我发现这对性能非常不利,因为如果我需要总结所有交易中每个人的金额,我需要循环Person*Transaction*TransactionPerson次来实现"加入",同时总结金额.

我的想法

我的想法是在Transaction模型中有两个列表:

class Transaction(db.Model):
    persons = ListProperty(db.Key)
    persons_amount = ListProperty(float)
Run Code Online (Sandbox Code Playgroud)

这样我就不需要遍历每个Person的所有TransactionPerson来查找关联的Transaction.我仍然可以根据Person查询事务.

质询

  1. 这可能吗?您是否相信存储/重试时列表顺序始终相同所以索引在列表之间同步?
  2. 这是与关联数据实现多对多关系的好方法吗?

python google-app-engine google-cloud-datastore

6
推荐指数
1
解决办法
594
查看次数

活动记录:急切加载与参数的关联

我有以下型号:

class Rating < ActiveRecord::Base
  belongs_to :item
  belongs_to :user
end

class Item < ActiveRecord::Base
  has_many :ratings
end
Run Code Online (Sandbox Code Playgroud)

我想获取所有项目,以及特定用户的评级,以显示每个项目旁边的当前用户评级(如果存在!).

我试过了...

Item.includes(:ratings).where('ratings.user_id = ?', user_id)
Run Code Online (Sandbox Code Playgroud)

...但是没有给我没有评级的项目.

我的第一个想法是与参数的has_many关联,然后使用includes方法传递该参数.但这似乎并不存在.

如何在不执行N + 1查询或将所有实体加载到内存中的情况下,在参数上过滤所有帖子和预先加载的关联?

activerecord ruby-on-rails ruby-on-rails-3

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

找出iOS中货币的小数位数

我使用 NSNumberFormatter 以本地化的方式格式化货币,它工作正常。但我想覆盖它并为用户提供覆盖小数分隔符后位数的选项。

如何找出 NSNumberFormatter 将用于某种货币的位数?我查看了 NSLocale 对象,但没有一个键告诉我这一点。

NSString * const NSLocaleIdentifier;
NSString * const NSLocaleLanguageCode;
NSString * const NSLocaleCountryCode;
NSString * const NSLocaleScriptCode;
NSString * const NSLocaleVariantCode;
NSString * const NSLocaleExemplarCharacterSet;
NSString * const NSLocaleCalendar;
NSString * const NSLocaleCollationIdentifier;
NSString * const NSLocaleUsesMetricSystem;
NSString * const NSLocaleMeasurementSystem;
NSString * const NSLocaleDecimalSeparator;
NSString * const NSLocaleGroupingSeparator;
NSString * const NSLocaleCurrencySymbol;
NSString * const NSLocaleCurrencyCode;
NSString * const NSLocaleCollatorIdentifier;
NSString * const NSLocaleQuotationBeginDelimiterKey;
NSString * const NSLocaleQuotationEndDelimiterKey;
NSString * const NSLocaleAlternateQuotationBeginDelimiterKey; …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c nsnumberformatter ios nslocale

3
推荐指数
1
解决办法
805
查看次数

在彼此之后过早调用UITableView的reloadData时崩溃

我有一个文本字段,显示用户键入名称时的建议表视图.数据源的过滤是在后台线程中进行的,因为它可能需要一些时间.

- (IBAction)personNameChanged:(UITextField *)sender
{
    NSString *name = sender.text;

    [backgroundThread performBlock:^{
            [self.personsDataSource filterDataSourceByName:name];
            [mainThread performBlock:^{
                [self.autoCompleteTableView reloadData];
            }];
    }];
}
Run Code Online (Sandbox Code Playgroud)

[UITableView reloadData] 要求:

  • -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

......同时所有细胞:

  • - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

......稍后会被召唤.

问题是当用户快速键入时,可能会发生filterDataSourceByName在所有单元格加载之前调用的情况.然后cellForRowAtIndexPath调用不存在的indexPath.

当调用reloadData太快以至于没有加载上次重新加载的所有单元格时,如何解决此问题?

cocoa-touch objective-c uitableview

2
推荐指数
1
解决办法
1277
查看次数