سؤال

أحاول تنزيل الصورة من عنوان URL http://a3.twimg.com/profile_images/41479787/05052008321_bigger.jpg

أنا أستخدم الكود التالي ، ولكن لم يتم حفظ الصورة في الجهاز. أريد أن أعرف ما أفعله خطأ.

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [NSURLConnection connectionWithRequest:request delegate:self];

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];
 NSData *thedata = NULL;
 [thedata writeToFile:localFilePath atomically:YES];

 UIImage *img = [[UIImage alloc] initWithData:thedata];
هل كانت مفيدة؟

المحلول

إذا قمت بتعيين theData ل nil, ، ماذا تتوقع أن تكتب إلى القرص؟

ما يمكنك استخدامه هو NSData* theData = [NSData dataWithContentsOfURL:yourURLHere]; لتحميل البيانات من القرص ثم حفظها باستخدام writeToFile:atomically:. إذا كنت بحاجة إلى مزيد من التحكم في عملية التحميل أو لديك في الخلفية ، فابحث عن وثائق NSURLConnection والدليل المرتبط.

نصائح أخرى

صادف أن لدي بالضبط ما تبحث عنه.

احصل على الصورة من عنوان URL

-(UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
    result = [UIImage imageWithData:data];

    return result;
}

احفظ الصورة

-(void) saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    if ([[extension lowercaseString] isEqualToString:@"png"]) {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
    } else {
        NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

تحميل الصورة

-(UIImage *) loadImage:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", directoryPath, fileName, extension]];

    return result;
}

كيف

//Definitions
NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

//Get Image From URL
UIImage * imageFromURL = [self getImageFromURL:@"http://www.yourdomain.com/yourImage.png"];

//Save Image to Directory
[self saveImage:imageFromURL withFileName:@"My Image" ofType:@"png" inDirectory:documentsDirectoryPath];

//Load Image From Directory
UIImage * imageFromWeb = [self loadImage:@"My Image" ofType:@"png" inDirectory:documentsDirectoryPath];

هذا هو الرمز لتنزيل الصورة من عنوان URL وحفظ تلك الصورة في الجهاز و هذه هو الرابط المرجعي.

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [NSURLConnection connectionWithRequest:request delegate:self];

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];
 NSData *thedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [thedata writeToFile:localFilePath atomically:YES];

احصل على الصورة من عنوان URL

-(UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
    result = [UIImage imageWithData:data];

    return result;
}

لقد نجح هذا الأمر بشكل رائع بالنسبة لي ، لكنني واجهت مشكلات في الذاكرة مع CFDATA (متجر). تم إصلاحه باستخدام AutoreleAsepool:

 -(UIImage *) getImageFromURL:(NSString *)fileURL {
    @autoreleasepool {
     UIImage * result;

     NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
     result = [UIImage imageWithData:data];

     return result;
    }
 }

نظرًا لأننا على iOS6 الآن ، لم تعد بحاجة إلى كتابة صور إلى قرص ضروري.
نظرًا لأن iOS5 يمكنك الآن تعيين "السماح للتخزين الخارجي" على سمة Coredata الثنائية. وفقًا لملاحظات إصدار التفاح ، فهذا يعني ما يلي:

قد يتم تخزين قيم البيانات الصغيرة مثل الصور المصغرة للصور بكفاءة في قاعدة بيانات ، ولكن من الأفضل التعامل مع صور Laarge أو الوسائط الأخرى مباشرة بواسطة نظام الملفات. يمكنك الآن تحديد أن قيمة سمة الكائن المدارة قد يتم تخزينها كسجل خارجي - انظر setallowsexternalbinaryDatastorage:عند تمكينه ، تقرر البيانات الأساسية بشكل مستثمر على أساس لكل قيمة ما إذا كان يجب أن يحفظ البيانات مباشرة في قاعدة البيانات أو تخزين URI إلى ملف منفصل يديره لك. لا يمكنك الاستعلام بناءً على محتويات خاصية البيانات الثنائية إذا كنت تستخدم هذا الخيار.

مرحبًا ، من الواضح أنك تكتب بيانات فارغة إلى ملفك.

في بيان الكود الخاص بك nsdata *thedata = null ؛ يشير إلى أنك تقوم بتعيين قيمة فارغة لبياناتك.

أنت تكتب بيانات خالية إلى ملفك أيضًا.

يرجى التحقق من الرمز الخاص بك مرة أخرى.

-(IBAction)BtnDwn:(id)sender
{
  [self.actvityIndicator startAnimating];

  NSURL *URL = [NSURL URLWithString:self.dataaArray];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];
  NSURLSession *session = [NSURLSession sharedSession];

  NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error)
   {

      NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
      NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
      NSURL *documentURL = [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
      BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[documentURL path]];

      if (exists)
      {
         NSLog(@"not created");
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download"
                                                    message:@"sory,file already exists"
                                                   delegate:nil
                                          cancelButtonTitle:@"cancel"
                                          otherButtonTitles:nil];
         [alert show];
      }
      else
      { 
         [[NSFileManager defaultManager] moveItemAtURL:location toURL:documentURL error:nil];
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download"
                                                    message:@"Succesfully downloaded"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
         [self.actvityIndicator stopAnimating];
         NSLog(@"wait downloading......");
         [alert show];
     }
  }];

    [downloadTask resume];    
}

إليكم كيف يمكنك حفظ صورة بشكل غير متزامن في Swift:

requestImage("http://www.asdf.com/89asdf.gif") { (image) -> Void in
    let myImage = image
}

func requestImage(url: String, success: (UIImage?) -> Void) {
    requestURL(url, success: { (data) -> Void in
        if let d = data {
            success(UIImage(data: d))
        }
    })
}

func requestURL(url: String, success: (NSData?) -> Void, error: ((NSError) -> Void)? = nil) {
    NSURLConnection.sendAsynchronousRequest(
        NSURLRequest(URL: NSURL (string: url)!),
        queue: NSOperationQueue.mainQueue(),
        completionHandler: { response, data, err in
            if let e = err {
                error?(e)
            } else {
                success(data)
            }
    })
}

تم تضمينه كدالة قياسية في ريبو:

https://github.com/goktugyil/ezswiftextensions

إليك مثال على كيفية تنزيل اللافتات على تطبيقي. أقوم بتنزيل الصور في الخلفية ، ومعظم تطبيقاتي لا تستخدم عد المرجع ، لذا أقوم بإصدار الكائنات.

- (void)viewDidLoad {
    [super viewDidLoad];

    [NSThread detachNewThreadSelector:@selector(loadImageInBackground) toTarget:self withObject:nil];

}

- (void) loadImageInBackground {
    NSURL *url = [[NSURL alloc] initWithString:@"http://yourImagePath.png"];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    [url release];
    UIImage *result = [[UIImage alloc] initWithData:data];
    [data release];

    UIImageView *banner_ImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
    [self.view addSubview:banner_ImageView];
    banner_ImageView.image = result;
    [result release];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top