我快疯了。例如,我有一个列出相册中的图片并为每个图片检索 NSURL 的类
"/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG"
我在那里设置了一个断点并检查,文件存在一切都很好。
我存储这些 URLS。在用户操作时,我调用另一个类来显示其中一个图像,并将 segue 上的 URL 传递给新的 View Controller 的一个属性。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "picDetailsSegue" {
if let picReviewController = segue.destinationViewController as? PicReviewViewController
{
if(clickedPicture != nil)
{
picReviewController.existingFilePath = clickedPicture.urlPath.path!
[initialize other stuff...]
}
}
}
}
但一旦到了那里,
NSFileManager.defaultManager().fileExistsAtPath(thePath!)
只是一直返回 false。我尝试了很多调整,比如将路径作为字符串传递,使用 NSURL 对象的“路径”和“relativePath”属性,我可以在网上找到的所有建议,没有任何效果,找不到文件并且以下总是返回 nil
let image = UIImage(contentsOfFile: theURL.path!)
控制台输出:
我第一次访问 URL 并存储它:
(lldb) print NSFileManager.defaultManager().fileExistsAtPath(url!.path!)
(Bool) $R1 = true
(lldb) print url!.path
(String?) $R3 = "/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG"
当我再次尝试访问它时
(lldb) print NSFileManager.defaultManager().fileExistsAtPath(clickedPicture.path!.path!)
(Bool) $R4 = false
(lldb) print (clickedPicture.path!.path!)
(String) $R5 = "/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG"
最佳答案
为了回答 Raymond26 和其他可能有类似问题的人,我终于明白你永远不应该对应用程序沙箱之外的文件路径做出任何假设,比如“/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG "
相反,您应该使用 PHAsset API 来读取和写入这些文件,如果您确实需要文件路径(就像我在处理文件上的 C 库时所做的那样),您应该将文件复制到您的执行此操作之前应用程序的临时目录。
static func copyToTemp(asset: PHAsset, desFileName: NSURL, requestedMaxSize: Int) throws
{
NSLog("copying asset to thumb for editing to: \(desFileName.path) with max size \(requestedMaxSize)")
// Clean temp as iOS doesnt do much overwriting in general
if(NSFileManager.defaultManager().fileExistsAtPath(desFileName.path!))
{
try NSFileManager.defaultManager().removeItemAtURL(desFileName)
}
if(requestedMaxSize < 0) // No resizing, just copy
{
let options = PHImageRequestOptions()
options.synchronous = true
PHImageManager.defaultManager().requestImageDataForAsset(asset, options: options, resultHandler: { (data: NSData?, name: String?, orientation: UIImageOrientation, stuff: [NSObject: AnyObject]?) in
do
{
try data?.writeToURL(desFileName, options: NSDataWritingOptions.AtomicWrite)
}
catch
{
NSLog("error writing full-sized to temp: \(error)")
}
})
}
else // Copy and resize
{
let size = CGSizeMake(CGFloat(requestedMaxSize), CGFloat(requestedMaxSize))
let options = PHImageRequestOptions()
options.synchronous = true
options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat
options.resizeMode = PHImageRequestOptionsResizeMode.Exact
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler:
{
(image: UIImage?, obj: [NSObject: AnyObject]?) -> Void in
do
{
try UIImageJPEGRepresentation(image!, 0.8)!.writeToURL(desFileName, options: NSDataWritingOptions.AtomicWrite)
}
catch
{
NSLog("error writing resized to temp: \(error)")
}
})
}
}
关于ios - NSFileManager fileExistsAtPath 在 segue(并且文件存在)之后为两个不同类中的相同路径返回 true 和 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39533401/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"