我正在使用Action"Log Message"的断点,我想打印NSIndexPath的行.所以我试过了,cell row @indexPath.row@但没有打印出来.我也尝试使用调试器命令:expr (void)NSLog(@"indexPath row:%i", indexPath.row)但是我收到一个错误:error: property 'row' not found on object of type 'NSIndexPath *'
我究竟做错了什么?
我正在使用NSOperationQueue并排队NSOperationBlocks.现在,块具有对块中任何实例的强引用,并且调用对象也对块具有强大的保持,因此建议执行如下操作:
__weak Cell *weakSelf = self;
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
UIImage *image = /* render some image */
/* what if by the time I get here self no longer exists? */
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[weakSelf setImageViewImage:image];
}];
}];
[self.renderQueue addOperation:op];
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,让我们说当图像完成渲染并且该行返回时,该Cell对象不再存在(它已被解除分配,可能是由于单元重用,这有点难以形式化).当我去访问时[weakSelf setImageViewImage:],会导致EXC_BAD_ACCESS错误吗?
目前我正在试图追踪问题的原因,我认为这可能与此有关.
目前,我的很多代码都广泛使用祖先来放置和获取对象.但是,我正在寻找改变一些东西.
我最初认为,如果你知道你正在寻找的实体的祖先是谁,那么祖先会更快地进行查询.但我认为事实证明,祖先对交易支持大多有用.我没有使用交易,所以我想知道祖先在这里是否比这更有帮助.
我所拥有的是一个用户实体,以及许多其他实体,例如评论,标签,朋友.用户可以创建许多评论,标签和朋友,因此每当用户这样做时,我将所有这些新创建的对象的祖先设置为用户.
因此,当我创建一个Comment时,我将祖先设置为用户:
comment = Comment(aUser, key_name = commentId)
Run Code Online (Sandbox Code Playgroud)
现在,我这样做的唯一原因是严格用于查询目的.我认为当我想要获得某个用户的所有评论以获得共同祖先的所有评论而不是查询authorEmail = userEmail的所有评论时会更快.
因此,当我想获得某个用户的所有评论时,我会:
commentQuery = db.GqlQuery('SELECT * FROM Comment WHERE ANCESTOR IS :1', userKey)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这是一个很好的使用祖先?是否每个Comment都有一个引用创建注释的User对象的ReferenceProperty,并按此过滤?
(另外,我的想法是使用祖先而不是索引的ReferenceProperty可以节省写入成本.我在这里错了吗?)
我有一个函数来将给定的字符串截断为给定的字节长度:
LENGTH_BY_PREFIX = [
(0xC0, 2), # first byte mask, total codepoint length
(0xE0, 3),
(0xF0, 4),
(0xF8, 5),
(0xFC, 6),
]
def codepoint_length(first_byte):
if first_byte < 128:
return 1 # ASCII
for mask, length in LENGTH_BY_PREFIX:
if first_byte & mask == mask:
return length
assert False, 'Invalid byte %r' % first_byte
def cut_string_to_bytes_length(unicode_text, byte_limit):
utf8_bytes = unicode_text.encode('UTF-8')
cut_index = 0
while cut_index < len(utf8_bytes):
step = codepoint_length(ord(utf8_bytes[cut_index]))
if cut_index + step > byte_limit:
# can't go a whole codepoint …Run Code Online (Sandbox Code Playgroud) // response is of type AnyObject!
let responseDic = response as [String : AnyObject]
let userDic = responseDic["user"] as [String : AnyObject]
Run Code Online (Sandbox Code Playgroud)
但是,在最后一行,我得到错误:
'(String, AnyObject)' is not convertible to '[String : AnyObject]'
Run Code Online (Sandbox Code Playgroud)
所以我猜测在字典中查找键会返回一个可选值,所以我尝试了:
let userDic = responseDic["user"]? as [String : AnyObject]
Run Code Online (Sandbox Code Playgroud)
但我得到:
'String' is not convertible to 'DictionaryIndex<String, AnyObject>'
Run Code Online (Sandbox Code Playgroud)
什么是使这个工作的正确方法?
我正在尝试缩放以适应地图上的注释,同时锁定中心并提供一些插图.
- (void)fitAnnotations:(NSArray *)annotations edgeInsets:(UIEdgeInsets)insets
{
CLLocationCoordinate2D originalCenter = self.centerCoordinate;
MKMapRect mapRect = MKMapRectNull;
for (id<MKAnnotation> annotation in annotations) {
MKMapPoint p = MKMapPointForCoordinate([annotation coordinate]);
mapRect = MKMapRectUnion(mapRect, MKMapRectMake(p.x, p.y, 0, 0));
}
mapRect = [self mapRectThatFits:mapRect edgePadding:insets];
MKCoordinateRegion mapRegion = MKCoordinateRegionForMapRect(mapRect);
// we now try to go back to the original center, while increasing the span by neccessary amount
MKCoordinateSpan centeringDelta = MKCoordinateSpanMake(fabs(mapRegion.center.latitude - originalCenter.latitude), fabs(mapRegion.center.longitude - originalCenter.longitude));
mapRegion.center = originalCenter;
mapRegion.span.latitudeDelta += centeringDelta.latitudeDelta * 2.0;
mapRegion.span.longitudeDelta += centeringDelta.longitudeDelta …Run Code Online (Sandbox Code Playgroud) 我只有一个常规的UITableView,我运行了这段代码:
UITableView *tableView = [[UITableView alloc] init];
for(UIGestureRecognizer *gesture in tableView.gestureRecognizers)
{
NSString *className = NSStringFromClass([gesture class]);
NSLog(@"ClassName:%@", className);
}
Run Code Online (Sandbox Code Playgroud)
其中一个输出线是: ClassName:UIGobblerGestureRecognizer
令人惊讶的是谷歌对此毫无兴趣.任何人都知道它是什么?
我已经能够在我的应用程序上确认这一点,并且我创建了一个快速示例应用程序来确认这一点.这是设置:
您有两个托管对象上下文:
masterMOC: NSPrivateQueueConcurrencyType, tied to persistent store coordinator
mainMOC: NSMainQueueConcurrencyType, child of masterMOC, NOT tied to any store coordinator
Run Code Online (Sandbox Code Playgroud)
此设置的灵感来自WWDC视频,它建议我们可以通过将其设置masterMOC为专用队列并将其绑定到持久性存储来保存后台线程.如果你设置了一个NSFetchedResultsController使用mainMOC(并且它必须是mainMOC那个与UI绑定的那个),并设置a fetchBatchSize,则忽略批量大小并且所有实体立即出现故障.我启用了SQLite调试注释,当滚动数千行(批量大小为20)时,没有任何错误被触发.
如果我进行一个简单的调整,即将持久性存储协调器绑定到mainMOC并使其成为根上下文(即,它不再是master的子节点),那么批量大小完美地工作,并且当我滚动数千行时,几个故障被解雇了.
这是预期的行为吗?我错过了什么吗?
您可以在此处下载示例项目
我有一个POST调用几个tasklet的方法.这些tasklet确实有产量x.put_async(),我的代码中确实有一些.所以我不希望它在所有异步内容完成之前返回.所以我装饰了我的所有tasklet,它们只是小功能@ndb.tasklet.另外,除了我的POST方法,我还有:
@ndb.toplevel
def post(self):
Run Code Online (Sandbox Code Playgroud)
但是,在文档中它声明:
但是如果一个处理程序方法使用yield,那么该方法仍然需要包装在另一个装饰器中,@ ndb.synctasklet; 否则,它将停止执行收益而不完成.
的确,我的方法有收益率.它已经包含在@ ndb.tasklet中.我是用@ ndb.synctasklet替换它还是我同时使用它们(如果是这样,我将如何使用它们)?
另外,请参阅此线程有一些相关性.我也注意到一个问题,我的请求将返回没有任何输出,但是不可重现.它每15分钟左右就会持续使用.我app = ndb.toplevel(webapp2.WSGIApplication([..])只有,但现在我已经添加@ndb.toplevel到主要POST方法,但问题仍然存在.
我应该把@ndb.tasklet方法放在那些方法上put_async()吗?(为了安全起见,我应该把它放在每个方法的顶部吗?这有什么缺点?)
我正在使用pytz.我已经阅读了整个文档表,但没看到如何做到这一点.
我有一个时区:美国/芝加哥.我想要的是获得这个时区的相应国家代码:美国.
它表明我可以做相反的事情,例如:
>>> country_timezones('ch')
['Europe/Zurich']
>>> country_timezones('CH')
['Europe/Zurich']
Run Code Online (Sandbox Code Playgroud)
但我需要反过来做.
这可以使用pytz(或任何其他方式)在Python中完成吗?