2016-05-01 10 views
4

私は画像(UIImageとそれもURLです)を持っていて、それをCloudSetにCKAsとして送信しようとしていますが、このエラーが発生しています:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Non-file URL'。ここにコードがあります:CloudKitにCKAssetとして画像を正しく送信する方法は?

私はURLを持っています。私はそれを印刷し、コピーしてナビゲーターに貼り付けることができます。だから、私はここで何が起こっているのかわからない...

URLの代わりにUIImageで作業した方が簡単だろうか?私が前にsaisのように、私はそれらの両方を持っているので!どんな助けもありがとうございます!みんなありがとう!!私の経験で

+0

読みますエラー。 'self.photoURL'はファイルURLではありません。それは何ですか? URLを印刷し、あなたの質問に出力を投稿してください。 – rmaddy

+0

'self.photoURL'は文字列です。 Facebookのリクエストを使ってユーザーデータを取得しました。ここでは、出力されます(https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/v/t1.0-1/p200x200/555081_482184835180445_3580351_n.jpg?oh=02f1cddcf8b810f67784bb11517306f1&oe=57AFC8F3&__gda__=1474738382_fc2e585632fdb724b8dd83b273edb691) –

+2

文字列がローカルファイルパスを表している場合は、 'string'初期化子の代わりに' fileURLWithPath'初期化子を使用して 'NSURL'を正しく作成するだけです。 – rmaddy

答えて

7

、唯一の方法はCKAssetとしてアップロードUIImageを保存することがあるに:

  1. 保存一時的にディスク
  2. にCKAsset
  3. を作成した画像の一時ファイルを削除します

let data = UIImagePNGRepresentation(myImage); // UIImage -> NSData, see also UIImageJPEGRepresentation 
let url = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(NSUUID().UUIDString+".dat") 
do { 
    try data!.writeToURL(url, options: []) 
} catch let e as NSError { 
    print("Error! \(e)"); 
    return 
} 
newUser["photo"] = CKAsset(fileURL: url) 

// ... 

publicData.saveRecord(newUser, completionHandler: { (record: CKRecord?, error: NSError?) in 
    // Delete the temporary file 
    do { try NSFileManager.defaultManager().removeItemAtURL(url) } 
    catch let e { print("Error deleting temp file: \(e)") } 

    // ... 
} 


私は数ヶ月前に CKAssetをインメモリ NSDataから初期化する機能を要求しましたが、まだ完了していません。

+0

ありがとう、サンタクロース!! –

2

私は少し違う何かをした:私はあなたが複数の場所で使用できるクラスを作って、スウィフトは(C++とは違って)働く再初期化を持っているという事実のおかげで、それ自体の後にクリーンアップ:

// 
// ImageAsset.swift 
// 

import CloudKit 
import UIKit 

class ImageAsset { 

    let image:UIImage 

    var url:NSURL? 

    var asset:CKAsset? { 
     get { 
      let data = UIImagePNGRepresentation(self.image) 
      self.url = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(NSUUID().UUIDString+".dat") 
      if let url = self.url { 
       do { 
        try data!.writeToURL(url, options: []) 
       } catch let e as NSError { 
        print("Error! \(e)") 
       } 
       return CKAsset(fileURL: url) 
      } 
      return nil 
     } 
    } 

    init(image:UIImage){ 
     self.image = image 
    } 

    deinit { 
     if let url = self.url { 
      do { 
       try NSFileManager.defaultManager().removeItemAtURL(url) } 
      catch let e { 
       print("Error deleting temp file: \(e)") 
      } 
     } 
    } 


} 
ここ

は、それを行使するユニットテストは、(テスト対象にストップウォッチという名前のイメージがある前提)です:

// 
// ImageExtensionTests.swift 
// 

import CloudKit 
import XCTest 
@testable import BudgetImpactEstimator 

class ImageExtensionTests: XCTestCase { 

    let testImageName = "stopwatch" // provide the name of an image in test bundle 
    override func setUp() { 
     super.setUp() 
     // Put setup code here. This method is called before the invocation of each test method in the class. 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func testConvertingImageToAsset() { 
     guard let image = UIImage(named: self.testImageName) else { 
      XCTFail("failed to load image") 
      return 
     } 
     let imageAsset = ImageAsset(image: image) 
     XCTAssertNotNil(imageAsset) 

     guard let asset = imageAsset.asset else { 
      XCTFail("failed to get asset from image") 
      return 
     } 

     print("constructed asset: \(asset)") 
    } 


} 

はもともとUIImageの拡張機能として、それをするつもりだったが、その後deistは私がAに移動作らクラス。

0

これは

このは、上に行くために多くの情報がないと掘りのかなりを取っCloudkit画像を保存する方法のObjective Cのバージョンがあるが、これは動作します

if([results count] <= 0) { 



      NSLog(@"this Record doesnt exist so add it ok!! %@", error); 

      CKRecordID *wellKnownID = [[CKRecordID alloc] 
             initWithRecordName:idString]; 


      CKRecord *entitiesName = [[CKRecord alloc] initWithRecordType:@"mySavedDetails" 
                  recordID:wellKnownID]; 


      [entitiesName setObject:idString 
         forKey:@"myDetailsId"]; 

      [entitiesName setObject:self.myName.text 
         forKey:@"myName"]; 



    if (myUIImage.image != nil) 
       { 
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                      NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0]; 
        NSString* path = [documentsDirectory stringByAppendingPathComponent: 
             @"test.png" ]; 
        NSData* data = UIImagePNGRepresentation(myUIImage.image.image); 
        [data writeToFile:path atomically:YES]; 

    //so we get the full path of the uiimage 

        NSLog(@"Path details %@",path); 


        NSURL* myImagePath = nil; 
        myImagePath = 
        [[NSBundle mainBundle] URLForResource:path 
              withExtension:@"png"]; 



//here we change the path of Image which is a string to a URL 
        NSURL *yourURL = [NSURL fileURLWithPath:path]; 

        CKAsset* myImageAsset = nil; 
        myImageAsset = 
        [[CKAsset alloc] initWithFileURL:yourURL]; 




       [entitiesName setObject: myImageAsset 
           forKey:@"myImage"]; 




       [publicDatabase saveRecord: entitiesName 
          completionHandler:^(CKRecord *savedState, NSError *error) { 
           if (error) { 
            NSLog(@"ERROR SAVING: %@", error); 
           } 


          }]; 



       } 




      } 
関連する問題