Programim dhe zhvillim, javascript, python, php, html

Të analizohet ID-ja e objektit të personalizuar të Swift?

Do të doja të krijoja një objekt me një ID të objektit të personalizuar. Arsyeja pse dua ta bëj këtë është sepse do të doja që metoda e ruajtjes të dështonte nëse përpiqet të krijojë një rresht me të njëjtat të dhëna. Për shembull: Analizimi automatikisht dështon të ruhet nëse përpiqeni të regjistroheni me një email që është marrë tashmë. Do të doja që e njëjta gjë të ndodhte për të dhënat në një klasë që nuk është një klasë Përdoruesi.

Përndryshe, unë mund t'i bëj gjërat të funksionojnë nëse do të dija ta bëja këtë

if(class contains column with "this string of data"){
    do nothing}
else{
    save "this string of data"}

Ajo që po bëj është të zbatoj një sistem votimi pozitiv dhe kundër, dhe nuk dua që përdoruesit të mund të votojnë më shumë se një herë për një postim të vetëm.

Sa herë që një përdorues voton, ai do të hynte në analizimin e një rreshti të dhënash me një kolonë që është e llojit të vargut që do të ishte përmbajtja e postimit + votues. dhe kështu nëse ai kombinim i përmbajtjes së postimit + votues do të përpiqet të ruhet përsëri, unë dua që ai të dështojë. Ky është kodi për një qelizë në pamjen e tabelës. Ky është kodi downVote. (kodi upVote do të ishte shumë i ngjashëm)

//intVotes goes into a label with the amount of votes 
//thisReview contains the content of the post
//downVote() increments number of votes by -1 in Parse

@IBAction func downVote(sender: AnyObject) {

    var reviewQuery: PFQuery = PFQuery(className: "reviews")
    reviewQuery.whereKey("content", equalTo: reviewTextView.text)
    reviewQuery.findObjectsInBackgroundWithBlock{
        (objects:[AnyObject]!, error:NSError!)->Void in

        if error == nil{

            for object in objects{
                let review:PFObject = object as! PFObject
                self.defaults.setValue(review["content"], forKey: "thisReview")
            }
        }
    }

var vote:PFObject = PFObject(className: "votes")

    if String(stringInterpolationSegment: vote.valueForKey("votes")) != String(stringInterpolationSegment: defaults.valueForKey("thisReview")) + String(stringInterpolationSegment: PFUser.currentUser()){
        vote.setValue(String(stringInterpolationSegment: defaults.valueForKey("thisReview")) + String(stringInterpolationSegment: PFUser.currentUser()), forKey: "objectId")
        vote.saveInBackgroundWithBlock {
            (succeeded: Bool, error: NSError!) -> Void in
            if error == nil {

                self.downVote()
                var intVotes: Int = self.votes.text!.toInt()!
                intVotes = intVotes - 1
                self.votes.text = "\(intVotes)"
            } else {
                println ("Failed")
            }
        }

    }
    else{
        //do nothing
    }
 }   

Kjo pothuajse funksionon, përveç anës së majtë të ekuacionit në deklaratën if (pjesa vote.valueForKey) kthen zero çdo herë.

23.08.2015

  • @Lamar ju lutem shikoni modifikimin 23.08.2015
  • jo, e kam shkruar tashmë atë kod. Unë u përpoqa ta bëja këtë duke krijuar një klasë për votat në analizë dhe kur një përdorues voton, ajo ruan në analizë një vlerë vargu të postimit + votuesit. kështu që nëse mund të kontrolloja nëse postimi + votuesi është shfaqur tashmë në klasë, atëherë mund ta parandaloj përdoruesin të votojë përsëri 23.08.2015
  • A do të funksiononte nëse vota e postimit do të ishte një grup User.ObjectID, në këtë mënyrë ju zbatoni një votë për postim. Për të numëruar votat, ju vetëm numëroni artikujt në Set. 23.08.2015
  • ju duhet të kontrolloni nëse Përdoruesi aktual ka votuar tashmë nëse po, ju i pengoni ata të votojnë, përndryshe i lejoni të votojë 23.08.2015
  • @DogCoffee Ka edhe vota kundër. Kështu që do të më duhej të fshija një rresht për votë kundër. Dhe nuk di si të zbatoj një votë për postim. Unë u përpoqa ta çaktivizoj butonin pasi është shtypur, por postimet janë në një pamje tabele dhe kështu çdo buton është i dyfishuar në mënyrë identike, kështu që çaktivizimi i një butoni do t'i çaktivizojë të gjitha. 23.08.2015
  • mund të postoni kodin tuaj që ne të mundemi dhe ? kështu që ju po bëni teknikisht një buton votimi dhe zbritje në pamjen tuaj të tavolinës djathtas 23.08.2015
  • @Lamar kjo nuk do të funksiononte sepse nëse ata tashmë kanë vota unë thjesht nuk mund t'i pengoj ata të votojnë më sepse dua që ata të votojnë për më shumë postime që nuk i kanë votuar ende. 23.08.2015
  • po ju mund t'i parandaloni sepse nëse id-ja e tyre gjendej në atë artikull, ju mund ta fshihni butonin prej tyre 23.08.2015
  • @Lamar Butonat në të gjitha postimet janë i njëjti shembull. Nëse fsheh një buton, i fsheh të gjitha. 23.08.2015
  • krijoni dy butona të ndryshëm, pastaj një për votën lart dhe të dytin për votën kundër ... kështu që nëse përdoruesi i pëlqen tashmë të gjitha postimet, thjesht mund t'i fshehni ato butona 23.08.2015
  • @Lamar Unë kam butona të veçantë. Nuk funksionon kështu 23.08.2015
  • nëse keni atë që sugjerova, por gjithashtu keni një votë kundër, atëherë ju zbatoni një votë kundër dhe një votë kundër. Shtojini së bashku për të marrë votën aktuale për atë postim. Nuk më pëlqen ideja e çaktivizimit të një butoni. Për të mbuluar problemin e votave të shumëfishta, duhet të regjistroni personin që ka votuar në objektin aktual të postimit. 23.08.2015

Përgjigjet:


1

Thjesht duhet të përktheni atë që Parse ju tregon tashmë në tutorialin e tyre të quajtur "AnyPic", ata zbatojnë dhe zbatojnë sistemin "like buton" të votimit lart/poshtë në ObjC, këtu është elementi kryesor i përkthyer në Swift që do t'ju duhet të importoni PAPCache.h/m PAPConstants. h/m dhe PAPUtility.h/m në projektin tuaj dhe ndërtoni një titull lidhës për t'u lidhur me këta skedarë. Nga atje, e vetmja pjesë që duhet të kuptoni është se si të modifikoni kodin e mëposhtëm për t'iu përshtatur nevojave tuaja, por kjo tashmë po funksionon, thjesht duhet të riorganizoni variablat dhe t'i ndryshoni gjërat në Opsionale ose JO-opsionale për ta bërë këtë të funksionojë për ty. Unë do të supozoja se kjo metodë është metoda MË TË MIRË pasi Parse e përdor vetë këtë metodë në tutorialin e tyre të ObjC BIG për të treguar gjithçka që është aplikacioni "AnyPic", do t'ju duhet të deklaroni një pronë në UIVIewController të llojit PFObject dhe më shumë. , por kjo është thelbi i kodit. Askush nuk do t'ju japë kodin e plotë pasi kjo do të marrë shumë kode dhe do të ishte më e lehtë nëse do ta bënit këtë në Swift në vend që të keni nevojë të bëni atë që sapo bëra në 30 minutat e fundit. Kalimi i kësaj për të përputhur me kodin ObjC do të jetë i mundimshëm, por kjo është mënyra se si bëhet. Paç fat!

Çfarë duhet të deklaroni, të paktën:

var likeUsers : NSArray?
var likeButton: UIButton?
var someObject: PFObject?

Metoda:

func didTapLikeButtonAction(button: UIButton) {
    var liked = Bool()
    liked  = !button.selected

    button.removeTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents: UIControlEvents.TouchUpInside)
    var originalLikeUsersArray =  NSArray()
    originalLikeUsersArray = self.likeUsers!
    var newLikeUsersSet = NSMutableSet(capacity: self.likeUsers!.count)
    for id in self.likeUsers! {
        if id.objectId != PFUser.currentUser()?.objectId {
            newLikeUsersSet.addObject(id)
        }
    }
    if liked {
        PAPCache.sharedCache().incrementLikerCountForPhoto(self.someObject)
        newLikeUsersSet.addObject(PFUser.currentUser()!)
    } else {
        PAPCache.sharedCache().decrementLikerCountForPhoto(self.someObject)
    }
    PAPCache.sharedCache().setPhotoIsLikedByCurrentUser(self.someObject, liked: liked)
    likeUsers = newLikeUsersSet.allObjects
    if liked {
        PAPUtility.likePhotoInBackground(self.someObject, block: {(success: Bool, error: NSError?) -> Void in
            if !success {
                button.addTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents:UIControlEvents.TouchUpInside)
                self.likeUsers = originalLikeUsersArray
                self.setLikeButtonState(true)
            }
        })
    } else {
        PAPUtility.unlikePhotoInBackground(self.someObject, block: {(success: Bool, error: NSError?) -> Void in
            if !success {
                button.addTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents:UIControlEvents.TouchUpInside)
                self.likeUsers = originalLikeUsersArray
                self.setLikeButtonState(false)
            }
        })
    }
}

LikeButtonFunction përkthyer nga ObjC

func setLikeButtonState(selected: Bool) {
    if selected {
        likeButton?.titleEdgeInsets = UIEdgeInsetsMake( -1.0, 0.0, 0.0, 0.0)
    } else {
        likeButton?.titleEdgeInsets = UIEdgeInsetsMake( 0.0, 0.0, 0.0, 0.0)
    }
    likeButton?.selected = selected
}

Ju do të duhet të shkarkoni projektin "Anypic" nga këtu:

https://parse.com/tutorials/anypic

dhe do t'ju duhet të importoni në projektin tuaj Swift, minimalisht, sa vijon:

#import "PAPCache.h"
#import "PAPConstants.h"
#import "PAPUtility.h"

Më pas do t'ju duhet të rikodoni PAPCache, PAPUtility dhe PAPConstants për t'iu përshtatur nevojave tuaja. Fat i mirë, ky do të jetë shumë kodim për shkak të Swift, por mund të jetë pothuajse pa kodim nëse do të përdorni ObjC siç Parse ka thënë vazhdimisht se ata nuk do të bëjnë një shtytje të madhe në Swift derisa të testohet në betejë. Herën e fundit që ata e thanë këtë përsëri ishte vetëm dy muaj më parë në qershor.

Kodi origjinal, nga Objective-C, ka disa gjëra që nuk i kam bërë për ju pasi ky është aplikacioni JUAJ dhe do të duhet t'i bëni vetë këto gjëra nëse e shihni të nevojshme, përsëri, kodi ObjC është kryer, por ju zgjodhët për të përdorur Swift, kështu që rikodimi i asaj që tashmë është dhënë në thelb, "jashtë kutisë" është ajo me të cilën do të duhet të merreni:

- (void)didTapLikePhotoButtonAction:(UIButton *)button {

    BOOL liked = !button.selected;
    [button removeTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    [self setLikeButtonState:liked];

    NSArray *originalLikeUsersArray = [NSArray arrayWithArray:self.likeUsers];
    NSMutableSet *newLikeUsersSet = [NSMutableSet setWithCapacity:[self.likeUsers count]];

    for (PFUser *likeUser in self.likeUsers) {
        if (![[likeUser objectId] isEqualToString:[[PFUser currentUser] objectId]]) {
            [newLikeUsersSet addObject:likeUser];
        }
    }

    if (liked) {
        [[PAPCache sharedCache] incrementLikerCountForPhoto:self.photo];
        [newLikeUsersSet addObject:[PFUser currentUser]];
    } else {
        [[PAPCache sharedCache] decrementLikerCountForPhoto:self.photo];
    }

    [[PAPCache sharedCache] setPhotoIsLikedByCurrentUser:self.photo liked:liked];

    [self setLikeUsers:[newLikeUsersSet allObjects]];

    if (liked) {
        [PAPUtility likePhotoInBackground:self.photo block:^(BOOL succeeded, NSError *error) {
            if (!succeeded) {
                [button addTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
                [self setLikeUsers:originalLikeUsersArray];
                [self setLikeButtonState:NO];
            }
        }];
    } else {
        [PAPUtility unlikePhotoInBackground:self.photo block:^(BOOL succeeded, NSError *error) {
            if (!succeeded) {
                [button addTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
                [self setLikeUsers:originalLikeUsersArray];
                [self setLikeButtonState:YES];
            }
        }];
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:PAPPhotoDetailsViewControllerUserLikedUnlikedPhotoNotification object:self.photo userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:liked] forKey:PAPPhotoDetailsViewControllerUserLikedUnlikedPhotoNotificationUserInfoLikedKey]];
}

- (void)didTapLikerButtonAction:(UIButton *)button {
    PFUser *user = [self.likeUsers objectAtIndex:button.tag];
    if (delegate && [delegate respondsToSelector:@selector(photoDetailsHeaderView:didTapUserButton:user:)]) {
        [delegate photoDetailsHeaderView:self didTapUserButton:button user:user];
    }    
}

- (void)didTapUserNameButtonAction:(UIButton *)button {
    if (delegate && [delegate respondsToSelector:@selector(photoDetailsHeaderView:didTapUserButton:user:)]) {
        [delegate photoDetailsHeaderView:self didTapUserButton:button user:self.photographer];
    }    
}

Kodi ObjC nga lart vjen nga skedari "PAPPhotoDetailsHeaderView.m" i depove të Parse.com AnyPic github dhe ju mund të shihni tutorialin e tyre OBJECTIVE-C për këtë në faqen e tyre të internetit në faqen e internetit që kam renditur më sipër.

Dhe, meqë ra fjala, kjo funksionon për mua, dhe përpilohet për mua, por unë nuk përdor Swift, kështu që kjo është e kotë për mua, por nëse i vendosni gjërat si duhet, nuk keni nevojë të ngatërroni me PAPCache, PAPConstants dhe PAPutility. Por kjo supozon se ju jeni të përgatitur mirë në të gjitha gjërat Parse. Gjithsesi, fat të mirë.

Sapo shtova funksionin likeButtonOn/Off, përkthyer nga ObjC

23.08.2015
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..